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上的短语和通配符查询的主要内容,如果未能解决你的问题,请参考以下文章

ES:Kibana

ES:Kibana

Elasticsearch短语搜索——match_phrase

如何使用 Elasticsearch java api 进行短语建议查询?

Elasticsearch匹配短语前缀不匹配所有术语

elasticsearch通配符和正则表达式查询