Elasticsearch上的短语和通配符查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch上的短语和通配符查询相关的知识,希望对你有一定的参考价值。
在尝试创建只能匹配整个短语的查询时,我遇到了一些困难,但也允许使用通配符。
基本上我有一个包含字符串的字段(它实际上是一个字符串列表,但为了简单起见,我正在跳过它),它可以包含空格或为空,我们称之为“颜色”。
例如:
...
"color": "Dull carmine pink"
...
我的查询需要能够执行以下操作:
- 搜索空值(包含和排除)
- 搜索非空值(包含和排除)
- 搜索并匹配整个短语(包含和排除)。例如: 暗淡的胭脂红 - >匹配 胭脂红 - >不匹配
- 与上一个相同,但使用通配符(包含和独占)。例如: ?ull carmine p * - >匹配“Dull carmine pink” 沉闷胭脂红* - >匹配“沉闷胭脂红” 等等
我已经用头撞了几天,我已经尝试了几乎所有类型的查询。
在this topic的帮助下,我只是设法使用span_near查询部分工作。
所以基本上我现在可以:
- 搜索带/不带通配符的整个短语,如下所示:
"span_near": "clauses": [ "span_term": "color": "dull" , "span_term": "color": "carmine" , "span_multi": "match": "wildcard": "color": "p*" ], "slop": 0, "in_order": true
- 通过简单的must / must_not查询搜索空值(包含和排除),如下所示:
"must" / "must_not": 'exist': 'field': 'color'
问题:我找不到一种方法来进行独占跨度查询。我能找到的唯一方法是this。但它需要包含和排除字段,我只是尝试排除某些字段,所有其他字段必须返回。是否有一些类似的“match_all”:查询可以在span_not的包含字段内工作?或者也许是一个全新的,更优雅的解决方案?
我一个月前找到了解决方案,但我忘记在这里发布了。我手头没有例子,但我会尝试解释一下。
问题是我在查询之前通过elasticsearch分析了我试图查询的字段。有问题的分析仪将它们除以空格等。这个问题的解决方案是两个中的一个:
1.如果不对索引使用自定义映射。
(这意味着如果您允许elasticsearch在添加时为您的字段动态创建适当的映射)。
在这种情况下,弹性搜索会自动创建名为“keyword”的文本字段的子字段。该子字段使用“关键字”分析器,该分析器在查询之前不以任何方式处理数据。
这意味着查询如下:
"query":
"bool":
"must": [ // must_not
"match":
"user.keyword": "Kim Chy"
]
和
"query":
"bool":
"must": [ // must_not
"wildcard":
"user.keyword": "Kim*y"
]
应该按预期工作。
但是,使用默认映射时,关键字字段很可能区分大小写。为了使它不区分大小写,您还需要创建一个自定义映射,在匹配之前将小写(或大写)规范化器应用于查询和关键字字段。
2.如果使用自定义映射
基本上与上面相同,但是您必须手动创建一个新的子字段(或字段),使用关键字分析器(可能还有一个规范化器,以使其不区分大小写)。
附:据我所知,在弹性搜索中不再可能更改映射。这意味着您必须使用适当的映射创建新索引,然后将数据重新索引到新索引。
以上是关于Elasticsearch上的短语和通配符查询的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch短语搜索——match_phrase