query_string用于elasticsearch中的确切术语

时间:2017-03-26 12:31:30

标签: elasticsearch

我正在尝试实现一个搜索,它只返回存储在列表中的术语的完全匹配。所以例如

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的可能性在一个字符串中。 有任何想法吗?

1 个答案:

答案 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"