我想检索包含一个特定术语后接另一个特定术语的文档。例如,
我在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
的文档,即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"
}
}
}
答案 0 :(得分:0)
您的搜索查询返回所有包含倒排索引中的标记AK和ARK的文档,该文档与所有3个文档匹配,并且按预期工作。
如果要返回包含AK后跟ARK的文档,则应使用match_phrase查询,如下所示,该查询将返回doc2和doc3,因为它们包含AK后跟ARK。
GET /_search
{
"query": {
"match_phrase" : {
"myfield" : "AKARK"
}
}
}