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