Elasticsearch上的词组和通配符查询

时间:2019-02-26 21:01:02

标签: html elasticsearch wildcard phrase

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

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

例如:

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

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

  • 搜索空值(包含值和排除值)
  • 搜索非null值(包含和排除)
  • 仅搜索和匹配整个短语(包括和排除)。例如:
    • 暗红色胭脂粉->匹配
    • 胭脂红--不匹配
  • 与最后一个相同,但带有通配符(包括和不包括)。例如:
    • ?ull胭脂红p *->与“ Dull胭脂红粉”相匹配
    • 暗红色胭脂*->与“暗红色胭脂粉”匹配

为此,我已经将头撞墙了几天,并且尝试了几乎所有我能想到的查询。

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字段内使用?还是全新,更优雅的解决方案?

1 个答案:

答案 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。据我所知,弹性搜索中不再可能更改映射。这意味着您将必须使用适当的映射来创建新索引,然后将数据重新索引为新索引。