【问题标题】:Elasticsearch - How to match number range in stringElasticsearch - 如何匹配字符串中的数字范围
【发布时间】:2020-07-19 20:15:17
【问题描述】:

我想编写一个查询来查找包含名称和数字 +/- 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 编写的。

谢谢

【问题讨论】:

    标签: python elasticsearch elastic-stack


    【解决方案1】:

    您可以对要查询的范围进行预处理:

    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"]
    }
    

    【讨论】:

    • 是的,小范围应该没问题,但要注意范围大时的性能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多