如何在弹性嵌套查询中查询*值?

时间:2019-04-23 06:22:12

标签: elasticsearch

我有这样的带有嵌套条目的文档:

{
    "query": {
        "nested" : {
            "path" : "listOfElements.entries",
            "score_mode" : "avg",
            "query" : {
                "bool" : {
                    "must" : [
                    { "match" : {"listOfElements.entries.key1" : "value3"} },
                    { "match" : {"listOfElements.entries.key2" : "*" } }
                    ]
                }
            }
        }
    }
}

因此,第二个条目中的*是实际的String值,而不是通配符。

现在,我正在尝试使用以下正文查询具有key1:value3和key2:*的所有文档:

"settings": {
    "analysis": {
        "analyzer": {
            "rebuilt_standard": {
                "tokenizer": "standard",
                "char_filter": [
                    "replace_star_filter"
                ]
            }
        },
        "char_filter": {
            "replace_star_filter": {
                "type": "mapping",
                "mappings": [
                    "* => _star_"
                ]
            }
        }
    }
}

但是,这根本不返回任何文档。

此外,使用“ \\ *”作为key2的查询参数也无济于事。

甚至可以查询*作为实际的String值而不是通配符吗?

在第一个答案后进行

EDIT并提示分析器设置: 试图将我的索引配置为使用Elastic docs中所述的映射char_filter:

{
  "analyzer": "rebuilt_standard",
  "text": "I'm delighted about it *"
}

如果我手动调用分析网址(例如,有了这个身体

{
    "tokens": [
        {
            "token": "I'm",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "delighted",
            "start_offset": 4,
            "end_offset": 13,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "about",
            "start_offset": 14,
            "end_offset": 19,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "it",
            "start_offset": 20,
            "end_offset": 22,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "_star_",
            "start_offset": 23,
            "end_offset": 24,
            "type": "<ALPHANUM>",
            "position": 4
        }
    ]
}

我收到以下答复:

{{1}}

编辑2:我终于设法使它开始工作。我必须预先配置映射,以便特定字段可以使用我的自定义分析器。 对于我来说,棘手且出乎意料的是,当我运行搜索查询时,它将显示带有*的原始文档,但是如果我使用JSON Body从API运行查询,则可以使用 star 并获得匹配。

1 个答案:

答案 0 :(得分:0)

您的搜索语法是正确的,我认为问题出在您正在搜索的值上,更准确地说是您的索引正在使用哪个Analyzer

我假设您使用的是标准分析器(除非另外指定,否则索引也是默认的),基本上这意味着并不是您的所有数据都只是其中的一部分,因此,您应该进一步阅读哪些分析器会执行什么操作,但是,如果您要保存特定的ALPHANUMERIC字符(例如*),则必须创建一个自定义分析器。

TLDR:

好消息是,有可能,创建一个自定义分析器,以对特殊字符*进行索引。 坏消息意味着这需要从头开始创建新索引并将所有数据重新索引到其中。

您可以阅读有关如何更轻松地进行操作的信息here