当前位置: 首页 > 知识库问答 >
问题:

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

方昊阳
2023-03-14

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

"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的查询参数也没有帮助。

是否有可能将*作为实际的String值而不是通配符查询?

第一次回答后编辑,并提示Analyzer设置:尝试将我的索引配置为使用映射字符过滤器,如弹性文档中所述:

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

如果我手动调用analyze 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 Body从API运行查询,那么我可以使用star并获得匹配。

共有1个答案

鲁杜吟
2023-03-14

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

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

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

你可以在这里读到如何更容易地做这件事

 类似资料:
  • 我有一个嵌套文档,如: 据此,https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html,以上内容应匹配: } 鉴于以下情况不应出现:, 但不幸的是两者不匹配。有什么想法吗?

  • 我有一个弹性搜索索引集合,如下所示, 现在我需要通过将与其值匹配来搜索文档。(是一些字段,其值存储在中)例如。对于字段,如果它是,则应与上述文档匹配。 我尝试将其映射为嵌套对象,但我无法编写查询来搜索与其相应值匹配的2个或更多的键id。

  • 我正在构建一个搜索查询,它将一组约束()动态地添加到查询中。一般预期结构如下 换句话说,我有一组(一个或多个)必须全部满足的条件(上面的)。可能有几个这样的集合,其中任何一个都足以进行最后的匹配(上面的)。 这种结构的一个示例,由我的代码生成(这是完整的API查询,生成的部分是): 我对这个查询的理解是: 如果和 或 如果 条目将匹配 不幸的是,我把Elasticsearch称为错误 这个错误是什

  • 问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套

  • 和相应的查询解析器 这里的主要想法只是有一个过滤器,可以看到什么食谱有一些成分,用户会通过应用程序通知。 我使用数据库中的所有食谱获得了“recipe”查询,但我需要一个获取这些食谱的查询,然后使用field comprient进行筛选,例如: 食谱-糖蛋糕,配料:糖、蜂蜜、四个… 配方-天鹅绒蛋糕,配料:糖、香草、... 并且用户通知Sugar,API应该返回这2个食谱,但是如果用户通知Suga

  • 我正试图用jooq编写这个查询 我尝试了几件事,但没有成功。到目前为止,我只得到 如何将num列添加到结果中?感谢您的帮助。