所以我有以下ElasticSearch查询:
"query": {
"bool": {
"must": [
{
"nested": {
"path": "specs",
"query": {
"bool": {
"must": [
{
"match": {
"specs.battery": "2 hours"
}
}
],
"minimum_should_match": 1
}
}
}
},
{
"terms": {
"category_ids": [
16405
]
}
}
]
}
}
目前,它会返回2
值hours
或specs.battery
的所有文档。我如何修改此查询,以便它只返回在2 hours
字段中具有完全短语specs.battery
的文档?同样,我希望能够有多个短语(2小时,2小时,3小时等)。这可以实现吗?
答案 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