Как получить документы, содержащие определенный термин, за которым следует другой конкретный термин в ElasticSearch? - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу получить документ, содержащий определенный термин, за которым следует другой конкретный термин.Например, у меня есть индекс [index name: demo, type name: demo] в ElasticSeach, и у него есть 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, то есть doc2 и doc3, а не doc1.Я использую query_string[AND] и получаю doc1, doc2 и doc3.Это не то, что я хочу.Так как же достичь своей цели?

ДЕМО-код:

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 голосов
/ 23 ноября 2018

Ваш поисковый запрос возвращает все документы, содержащие токены AK & ARK в инвертированном индексе, и это соответствует всем 3 документам и работает как ожидалось.

Если вы хотите вернуть документы, содержащие AK, а затем ARK, то выследует использовать запрос match_phrase, как показано ниже, который возвращает doc2 и doc3, поскольку они содержат AK, за которым следует ARK.

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