我有这样嵌套条目的文档:
"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并获得匹配。
你的搜索语法是正确的,我认为问题在于你正在搜索的值,更准确地说,你的索引使用的是哪个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列添加到结果中?感谢您的帮助。