我在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\""
}
}
}'
我希望弹性搜索匹配我传递给查询参数的确切短语,使用空格,我该怎么做?
答案 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)
另一个不错的解决方案是使用match
和minimum_should_match
(提供要匹配的单词的百分比)。它可以是100%,并将返回至少包含给定文本的结果;
这种方法不要考虑单词的顺序很重要。
"query":{
"bool":{
"should":[
{
"match":{
"my_text":{
"query":"I want to buy a new new car",
"minimum_should_match":"90%"
}
}
}
]
}
}