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

时间:2018-11-22 13:18:27

标签: elasticsearch elastic-stack elasticsearch-5

我想检索包含一个特定术语后接另一个特定术语的文档。例如, 我在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"
    }
  }
}

1 个答案:

答案 0 :(得分:0)

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

如果要返回包含AK后跟ARK的文档,则应使用match_phrase查询,如下所示,该查询将返回doc2和doc3,因为它们包含AK后跟ARK。

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