在ElasticSearch中查找完全匹配的短语

时间:2015-07-29 11:28:14

标签: elasticsearch

所以我有以下ElasticSearch查询:

"query": {
"bool": {
  "must": [
    {
      "nested": {
        "path": "specs",
        "query": {
          "bool": {
            "must": [
              {
                "match": {
                  "specs.battery": "2 hours"
                }
              }
            ],
            "minimum_should_match": 1
          }
        }
      }
    },
    {
      "terms": {
        "category_ids": [
          16405
        ]
      }
    }
  ]
}
}

目前,它会返回2hoursspecs.battery的所有文档。我如何修改此查询,以便它只返回在2 hours字段中具有完全短语specs.battery的文档?同样,我希望能够有多个短语(2小时,2小时,3小时等)。这可以实现吗?

1 个答案:

答案 0 :(得分:2)

弹性搜索中的数据默认为索引时标记化。这意味着索引表达式“2小时”的结果将是映射到同一文档的2个标记。 但是,没有一个令牌“2小时”,因此如果您使用过滤查询,它将搜索2或数小时甚至找不到它。

要让Elasticseach将“2小时”视为一个表达式,您需要将specs.battery定义为not_analyzed在您的映射中,如下所示:

curl -XPOST localhost:9200/your_index -d '{
    "mappings" : {
        "your_index_type" : {
            "properties" : {
                ...
                "battery" : { "type" : "string", "index":"not_analyzed" }
                ...
            }
        }
    }
}'

然后,您可以使用筛选查询进行完全匹配,如下所示:

curl -XGET 'http://localhost:9200/_all/_search?pretty=true' -d '
{
    "query": {
        "filtered" : {
            "filter" : {        
                "term": {
                    "battery": "2 hours"
        }
       }
     }
    }
}'

然后你将完全匹配。

更多详情请见:https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_exact_values.html

如果另一方面,您绝对需要分析您的字段或使用您无法更改的现有索引,您仍然可以通过使用“和”运算符来解决问题,如下所示:

curl -XGET localhost:9200/your_index'  -d '
{
    "query": {
        "match": {
           "battery": {
            "query": "2 hours",
            "operator": "and"
        }
    }
  }
}'

在最后一个选项中,您可能已经理解,如果您的文档具有“2小时和其他内容”,则文档仍将匹配,因此不如“not_analyzed”字段那样精确。< / p>

有关上一主题的更多详情:

https://www.elastic.co/guide/en/elasticsearch/guide/current/match-multi-word.html