如何在ElasticSearch中使query_string搜索精确短语

时间:2014-02-28 11:03:52

标签: elasticsearch

我在Elasticsearch中放了2个文件:

curl -XPUT "http://localhost:9200/vehicles/vehicle/1" -d'
{
    "model": "Classe A"
}'

curl -XPUT "http://localhost:9200/vehicles/vehicle/2" -d'
{
    "model": "Classe B"
}'

为什么此查询会返回2个文档:

curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
  "query": {
    "query_string": {
      "query": "model:\"Classe A\""
    }
  }
}'

这一个,只有第二个文件:

curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
  "query": {
    "query_string": {
      "query": "model:\"Classe B\""
    }
  }
}'

我希望弹性搜索匹配我传递给查询参数的确切短语,使用空格,我该怎么做?

4 个答案:

答案 0 :(得分:17)

您需要注意的是您正在使用的analyzer。如果您未指定一个Elasticsearch将使用Standard Analyzer。对于大多数使用纯文本输入的情况来说,这是很好的,但不适用于您提到的用例。

标准分析器将做的是拆分字符串中的单词,然后将它们转换为小写。

如果你想匹配整个字符串“Classe A”并将其与“Classe B”区分开来,你可以使用Keyword Analyzer。这会将整个字段保持为一个字符串。

然后您可以使用匹配查询,该查询将返回您期望的结果。

创建映射:

PUT vehicles
{
  "mappings": {
    "vehicle": {
      "properties": {
        "model": {
          "type": "string",
          "analyzer": "keyword"
        }
      }
    }
  }
}

执行查询:

POST vehicles/_search
{
  "query": {
    "match": {
      "model": "Classe A"
    }
  }
}

如果您想使用query_string查询,则可以将运营商设置为AND

POST vehicles/vehicle/_search
{
  "query": {
    "query_string": {
      "query": "Classe B",
      "default_operator": "AND"
    }
  }
}

答案 1 :(得分:8)

此外,您可以使用query_string并转义引号也会返回一个确切的短语:

POST _search
{
    "query": {
      "query_string": {
        "query": "\"Classe A\""
     }
}

答案 2 :(得分:5)

使用匹配短语查询,如下所述

GET /company/employee/_search   
{     
    "query" : {      
        "match_phrase" : {      
            "about" : "rock climbing"      
        }      
    }      
}

答案 3 :(得分:0)

另一个不错的解决方案是使用matchminimum_should_match(提供要匹配的单词的百分比)。它可以是100%,并将返回至少包含给定文本的结果;

这种方法不要考虑单词的顺序很重要。

"query":{
  "bool":{
     "should":[
        {
           "match":{
              "my_text":{
                 "query":"I want to buy a new new car",
                 "minimum_should_match":"90%"
              }
           }
        }
     ]
  }
}