【问题标题】:Phrase & wildcard queries on ElasticsearchElasticsearch 上的短语和通配符查询
【发布时间】:2019-02-26 21:01:01
【问题描述】:

在尝试创建只能匹配整个短语但也允许使用通配符的查询时,我遇到了一些困难。

基本上我有一个包含一个字符串的文件(它实际上是一个字符串列表,但为简单起见,我跳过了它),它可以包含空格或为空,我们称之为“颜色”。

例如:

{
  ...
  "color": "Dull carmine pink"
  ...
}

我的查询需要能够执行以下操作:

  • 搜索空值(包括和不包括)
  • 搜索非空值(包括和不包括)
  • 仅搜索和匹配整个短语(包括和不包括)。例如:
    • 沉闷的胭脂红 --> 搭配
    • 胭脂红-->不匹配
  • 与上一个相同,但使用通配符(包括和排他)。例如:
    • ?ull carmine p* --> 匹配“Dull carmine pink”
    • dull carmine* -> 匹配“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 的包含字段中工作?或者也许是一个全新的、更优雅的解决方案?

【问题讨论】:

    标签: html elasticsearch wildcard phrase


    【解决方案1】:

    我一个月前找到了解决方案,但我忘了在这里发布。 我手头没有例子,但我会试着解释一下。

    问题是我试图查询的字段在查询之前由 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. 据我所知,在弹性搜索中不再可能更改映射。这意味着您必须使用适当的映射创建一个新索引,然后将您的数据重新索引到新索引。

    【讨论】:

    • 假设,user.keyword 有两种可能,"Kimy" & "Abcyz" 那么!!!
    • 使用通配符搜索所有子字段的任何方法,即 user.* .. 我试过但 es 没有返回任何内容,所以我猜它不喜欢它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多