在尝试创建只能匹配整个短语但也允许使用通配符的查询时,我遇到了一些困难。
基本上,我有一个包含字符串的文件(它实际上是一个字符串列表,但为简单起见,我跳过了它),该文件可以包含空格或为null,可以将其称为“颜色”。
例如:
{
...
"color": "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": {'exist': {'field': 'color'}}
}
问题:
我找不到一种使独占范围查询的方法。我能找到的唯一方法是this。但这需要包括和排除两个字段,而我只想排除某些字段,必须返回所有其他字段。是否有一些类似于“match_all”:{}查询的类比,可以在span_not的include字段内使用?还是全新,更优雅的解决方案?
最佳答案
我在一个月前找到了解决方案,但忘了在此处发布。
我手头没有一个例子,但我会尽力解释。
问题是我要查询的字段在查询之前已由Elasticsearch分析。有问题的分析器将它们除以空格等。此问题的解决方案是两个解决方案之一:
1. 如果未对索引使用自定义映射。
(表示您让 flex 搜索在添加字段时为字段动态创建适当的映射)。
在这种情况下, flex 搜索会自动创建文本字段的子字段,称为“关键字”。该子字段使用“关键字”分析器,该分析器在查询之前不会以任何方式处理数据。
这意味着查询如下:
{
"query": {
"bool": {
"must": [ // must_not
{
"match": {
"user.keyword": "Kim Chy"
}
}
]
}
}
}和
{
"query": {
"bool": {
"must": [ // must_not
{
"wildcard": {
"user.keyword": "Kim*y"
}
}
]
}
}
}应该能按预期工作。
但是,使用默认映射时,关键字字段很可能区分大小写。为了使它也不区分大小写,您将需要创建一个自定义映射,在匹配之前将小写(或大写)规范化器应用于查询和关键字字段。
2.如果使用自定义映射
基本上与上述相同,但是您将必须手动创建一个新的子字段(或字段),该子字段使用关键字分析器(可能还需要规格化器,以便不区分大小写)。
P.S. 据我所知,在Elasticsearch中不再可能更改映射。这意味着您将必须使用适当的映射来创建新索引,然后将数据重新索引为新索引。
关于html - Elasticsearch上的短语和通配符查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54894026/