首页 > 解决方案 > Elasticsearch - 如何匹配字符串中的数字范围

问题描述

我想编写一个查询来查找包含名称和数字 +/- 5 的日志事件。由于我不知道此日志事件的确切结构,我无法在单独的 int 字段中提取数字。

我的查询目前看起来像这样。

    baseQuery = {
            "query": {
                    "bool": {
                    "must": [
                            {"match": {"sim_session" : "session_id"}},
                            {"match": {"event" : "putFilenameHere"}},
                            {"bool": {
                                    "should": [
                                            {"match_phrase": {"event" : "Name"}},
                                            #Search for the line in the event text
                                            {"match": {"event" : "42"}}
                                    ],
                                    "minimum_should_match" : 2
                            }}
                    ]
                    }
            }
            }

所以我可以找到包含“名称”和数字“42”(被视为字符串)的事件,但我想找到包含“名称”和 37 或 38 或 39 或 40 或 41 或 42 的事件或 43 或 44 或 45 或 46 或 47。有没有更聪明的方法来实现这一点,然后用不同的数字执行相同的查询 11 次?

执行此查询的脚本是用 python 编写的。

谢谢

标签: pythonelasticsearchelastic-stack

解决方案


您可以应用预处理要查询的范围:

  1. 如果您的字段event是文本,您的查询字符串将自动标记化并使用每个数字标记进行查询:
"match": {
  "event": "37 38 39 40 41 42 43 44 45"
}
  1. 如果您的字段event是关键字,则使用术语查询:
"terms": {
  "event": ["37", "38", "39", "40", "41", "42", "43", "44", "45"]
}

推荐阅读