【问题标题】:multiple like query in elastic search弹性搜索中的多个类似查询
【发布时间】:2015-12-30 23:47:26
【问题描述】:

我的弹性搜索文档中有一个字段path,其中包含这样的条目

/logs/hadoop-yarn/container/application_1451299305289_0120/container_e18_1451299305289_0120_01_011007/stderr
/logs/hadoop-yarn/container/application_1451299305289_0120/container_e18_1451299305289_0120_01_008874/stderr

#*Note -- I want to select all the documents having below line in the **path** field
/logs/hadoop-yarn/container/application_1451299305289_0120/container_e18_1451299305289_0120_01_009257/stderr

我想对这个path字段进行类似的查询给定某些事情(基本上是所有3个的AND条件):-

  1. 我给了申请号1451299305289_0120
  2. 我也给了任务号009257
  3. 路径字段还应包含stderr

鉴于上述条件,应选择路径字段作为第三行的文档

这是我迄今为止尝试过的

http://localhost:9200/logstash-*/_search?q=application_1451299305289_0120 AND path:stderr&size=50

此查询满足第三个条件,部分满足第一个条件,即如果我搜索 1451299305289_0120 而不是 application_1451299305289_0120,我得到 0 个结果。 (我真正需要的是搜索1451299305289_0120

当我尝试这个时

http://10.30.145.160:9200/logstash-*/_search?q=path:*_1451299305289_0120*008779 AND path:stderr&size=50

我得到了结果,但在开始时使用* 是一项昂贵的操作。他们是另一种有效实现这一目标的方法吗(例如使用nGram 和使用fuzzy-searchelastic-search

【问题讨论】:

  • 使用 nGram 会非常昂贵,但是你可以做什么 edgeNGram 在分析时使用几个过滤器。我建议你可以看看这篇文章。stackoverflow.com/questions/9421358/…这可能没什么帮助,如你可以得到一些方向..

标签: elasticsearch elasticsearch-plugin


【解决方案1】:

这可以通过使用Pattern Replace Char Filter 来实现。您只需使用regex 仅提取重要信息。这是我的设置

POST log_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "app_analyzer": {
          "char_filter": [
            "app_extractor"
          ],
          "tokenizer": "keyword",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        },
        "path_analyzer": {
          "char_filter": [
            "path_extractor"
          ],
          "tokenizer": "keyword",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        },
        "task_analyzer": {
          "char_filter": [
            "task_extractor"
          ],
          "tokenizer": "keyword",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      },
      "char_filter": {
        "app_extractor": {
          "type": "pattern_replace",
          "pattern": ".*application_(.*)/container.*",
          "replacement": "$1"
        },
        "path_extractor": {
          "type": "pattern_replace",
          "pattern": ".*/(.*)",
          "replacement": "$1"
        },
        "task_extractor": {
          "type": "pattern_replace",
          "pattern": ".*container.{27}(.*)/.*",
          "replacement": "$1"
        }
      }
    }
  },
  "mappings": {
    "your_type": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "keyword",
          "fields": {
            "application_number": {
              "type": "string",
              "analyzer": "app_analyzer"
            },
            "path": {
              "type": "string",
              "analyzer": "path_analyzer"
            },
            "task": {
              "type": "string",
              "analyzer": "task_analyzer"
            }
          }
        }
      }
    }
  }
}

我正在使用正则表达式提取application numbertask numberpath。如果您有其他一些日志模式,您可能需要稍微优化task regex,然后我们可以使用Filters 进行搜索。使用过滤器的一大优势是它们被缓存并进行后续调用更快。

我这样索引示例日志

PUT log_index/your_type/1
{
  "name" : "/logs/hadoop-yarn/container/application_1451299305289_0120/container_e18_1451299305289_0120_01_009257/stderr"
}

这个查询会给你想要的结果

GET log_index/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "name.application_number": "1451299305289_0120"
              }
            },
            {
              "term": {
                "name.task": "009257"
              }
            },
            {
              "term": {
                "name.path": "stderr"
              }
            }
          ]
        }
      }
    }
  }
}

附带说明filtered queryES 2.x 中已弃用,只需直接使用过滤器即可。另外path hierarchy 可能对其他用途有用

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多