如何在 ElasticSearch 中检索包含特定术语后跟另一个特定术语的文档?

How to retrieve the documents containing a specific term followed by another specific term in ElasticSearch?

我想检索包含一个特定术语后跟另一个特定术语的文档。例如, 我在 ElasticSeach 中有一个索引 [index name: demo, type name: demo],它有 3 个文档,比如

doc1 "myfield": "AKKARK"
doc2 "myfield": "AKARK"
doc3 "myfield": "AKKAKARK"

字段 myfield 设置了模式分词器,分词器将在字母 k 之后拆分字符串。所以倒排索引是

AK -> doc1,doc2,doc3
K -> doc1,doc3
ARK -> doc1,doc2,doc3

我想检索包含 AK 后跟 ARK 的文档,即 doc2doc3 而不是 doc1。 我使用 query_string[AND] 得到 doc1doc2doc3。这不是我想要的。那么如何达到我的目的呢?

演示代码:

PUT demo
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1,
    "analysis": {
      "analyzer": {
        "split_K_analyzer": {
          "type": "pattern",
          "pattern": "(?<=K)",
          "lowercase": false
        }
      }
    }
  },
  "mappings": {
    "demo":{
      "properties": {
        "myfield": {
          "type": "text",
          "analyzer": "split_K_analyzer"
        }
      }
    }
  }
}

PUT demo/demo/_bulk
{"index":{"_id" : "doc1"}}
{"myfield": "AKKARK"}
{"index": {"_id": "doc2"}}
{"myfield": "AKARK"}
{"index": {"_id": "doc3"}}
{"myfield": "AKKAKARK"}

GET demo/demo/_search
{
  "query": {
    "query_string": {
      "default_field": "myfield",
      "query": "AK AND ARK"
    }
  }
}

您的搜索查询 return 在倒排索引中包含标记 AK 和 ARK 的所有文档,这与所有 3 个文档匹配并且按预期工作。

如果你想 return 包含 AK 后跟 ARK 的文档,你应该使用 match_phrase 查询,如下所示 returns doc2 和 doc3,因为它们包含 AK 后跟 ARK。

GET /_search
{
    "query": {
        "match_phrase" : {
            "myfield" : "AKARK"
        }
    }
}