【问题标题】:How to query for * value in Elastic Nested Query?如何在弹性嵌套查询中查询 * 值?
【发布时间】:2019-09-12 07:05:48
【问题描述】:

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

"listOfElements": {
    "entries": [{
            "key1": "value1",
            "key2": "value2"
        }, {
            "key1": "value3",
            "key2": "*"
        }
    ]
}

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

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

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

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

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

是否甚至可以将 * 作为实际字符串值而不是通配符进行查询?

在第一个答案后编辑并提示分析器设置: 尝试将我的索引配置为使用 Elastic 文档中描述的映射 char_filter:

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

如果我手动调用分析 URL,这将有效,例如用这个身体

{
  "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
        }
    ]
}

编辑 2:我终于设法让它工作了。我必须事先配置映射,以便特定字段使用我的自定义分析器。 对我来说棘手和意想不到的事情是,当我运行搜索查询时,它会向我显示带有 * 的原始文档,但如果我使用 JSON 正文从 API 运行查询,那么我可以使用 star em> 并且会得到匹配。

【问题讨论】:

  • 如果您需要完全匹配,那么term 查询可能是要走的路。要使用它,您必须将该字段索引为 keyword 数据类型。

标签: elasticsearch


【解决方案1】:

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

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

TLDR:

好消息是的,可以创建一个自定义分析器来索引特殊字符 *。 坏消息是,这意味着从头开始创建一个新索引并将所有数据重新编入索引。

您可以阅读有关如何更轻松地做到这一点的信息here

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2021-09-01
    • 2015-09-24
    • 2020-07-26
    • 2017-06-11
    • 2018-09-28
    • 2017-05-20
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多