我正在尝试实现一个搜索,它只返回存储在列表中的术语的完全匹配。所以例如
karl : ['health care', dental care]
我使用关键字分析器存储它,因为我只对完全匹配感兴趣
doc = {
"settings" : {
"number_of_shards" : 1,
"number_of_replicas": 0,
},
"mappings" : {
"users" : {
"properties" : {
"plan_list" : {
"type" : "text",
"fields" : {
"raw" : {
"type" : 'keyword'
}
}
}
}
}
}
}
现在我想创建像
这样的搜索查询health care AND dental care
我在docs https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html中找到了query_string方法 ,这正是我需要的,除了我想要不分析查询字符串。如果我像这样实现它
doc = {
"query": {
"bool" : {
"must" : [{
"query_string": {
"query": health care AND dental care,
"fields": ["plan_list.raw"]
}
}]
}
}
}
确实
(plan_list.raw:health OR plan_list.raw:care) AND (plan_list.raw:dental OR plan_list.raw:care)
这不是我想要的。我不希望它将医疗保健分为两个词。我想要
(plan_list.raw:(health care)) AND (plan_list.raw:(dental care))
我知道query_string提供了default_operator,但是把它放到'和'没有解决问题,因为这个词没有被分析,因此没有存储为两个单词。
我知道,对于上面的例子,我可以用术语搜索创建一个bool / should或bool / must查询,但我的实际案例更复杂,我想保留直接使用AND / OR的可能性在一个字符串中。 有任何想法吗?
答案 0 :(得分:1)
您必须将精确短语放在双引号中,例如\"health care\" AND \"dental care\"
。请点击下面的查询:
GET {index_name}/_search
{
"query": {
"query_string": {
"default_field": "plan_list.raw",
"query": "\"health care\" OR \"dental care\""
}
}
}
您关注官方文档的this部分:
作者字段包含确切的短语" john smith"
作者:" John Smith"