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

Mol*_*daa 20 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"
}'
Run Code Online (Sandbox Code Playgroud)

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

curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
  "query": {
    "query_string": {
      "query": "model:\"Classe A\""
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

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

curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
  "query": {
    "query_string": {
      "query": "model:\"Classe B\""
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

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

Aks*_*hay 18

您需要注意的是您正在使用的分析仪.如果您未指定一个Elasticsearch将使用标准分析器.对于大多数使用纯文本输入的情况而言,这是很好的,但对于您提到的用例不起作用.

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

如果要匹配整个字符串"Classe A"并将其与"Classe B"区分开来,则可以使用关键字分析器.这将整个字段保持为一个字符串.

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

创建映射:

PUT vehicles
{
  "mappings": {
    "vehicle": {
      "properties": {
        "model": {
          "type": "string",
          "analyzer": "keyword"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

执行查询:

POST vehicles/_search
{
  "query": {
    "match": {
      "model": "Classe A"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果要使用query_string查询,则可以将运算符设置为AND

POST vehicles/vehicle/_search
{
  "query": {
    "query_string": {
      "query": "Classe B",
      "default_operator": "AND"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 12

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

POST _search
{
    "query": {
      "query_string": {
        "query": "\"Classe A\""
     }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

GET /company/employee/_search   
{     
    "query" : {      
        "match_phrase" : {      
            "about" : "rock climbing"      
        }      
    }      
}
Run Code Online (Sandbox Code Playgroud)

  • 该查询还会返回“ super rock hilling”,“ rock rocking and java”,以及包含“ rock rocking”的任何短语 (2认同)
  • @yaroslavTir 查询不返回字符串,它们返回与查询匹配的文档。在本例中,所有这些文档都与短语查询“rockclimbing”匹配,因为它们包含该子字符串。 (2认同)

Ric*_*ard 5

好像在最新版本的 ES 中你可以只使用 .keyword

POST vehicles/_search
{
  "query": {
    "term": {
      "model.keyword": "Classe A"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它将完全匹配字符串“Classe A”

由 ES 确定为文本的动态字段将有一个子字段“关键字”,对于这种情况非常有用: https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html