Я хочу получить документ, содержащий определенный термин, за которым следует другой конкретный термин.Например, у меня есть индекс [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"
}
}
}