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