【发布时间】: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> 并且会得到匹配。
【问题讨论】:
标签: elasticsearch