我在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\"" } } }'
我想elasticsearch以匹配我传递给查询参数的确切词组(带空格),该怎么做?
您需要查看的是正在使用的分析仪。如果您未指定,Elasticsearch将使用标准分析器。在大多数使用纯文本输入的情况下,它非常有用,但不适用于您提到的用例。
标准分析器将执行的操作是将字符串中的单词拆分,然后将其转换为小写字母。
如果要匹配整个字符串“ Classe A”并将其与“ Classe B”区分开,则可以使用关键字分析器。这样会将整个字段保留为一个字符串。
然后,您可以使用匹配查询,该查询将返回您期望的结果。
创建映射:
PUT vehicles { "mappings": { "vehicle": { "properties": { "model": { "type": "string", "analyzer": "keyword" } } } } }
执行查询:
POST vehicles/_search { "query": { "match": { "model": "Classe A" } } }
如果要使用query_string查询,则可以将运算符设置为AND
query_string
AND
POST vehicles/vehicle/_search { "query": { "query_string": { "query": "Classe B", "default_operator": "AND" } } }