python - 在 Elastic Search 中使用通配符进行部分搜索
问题描述
我想使用通配符在弹性搜索中搜索数组值。
{
"query": {
"wildcard": {
"short_message": {
"value": "*nne*",
"boost": 1.0,
"rewrite": "constant_score"
}
}
}
}
我正在搜索“short_messages”,它对我有用。但我想搜索“messages.message”它不起作用。
{
"query": {
"wildcard": {
"messages.message": {
"value": "*nne*",
"boost": 1.0,
"rewrite": "constant_score"
}
}
}
}
而且我还想在一个数组中搜索多个字段。
例如:- 字段:[“messages.message”,“messages.subject”,“messages.email_search”]
那么就有可能给我最好的解决方案。
提前致谢。
解决方案
似乎您正在nested
使用messages
.
您需要为此使用nested query
:
POST <your_index_name>/_search
{
"query": {
"nested": {
"path": "messages",
"query": {
"wildcard": {
"messages.message": {
"value": "*nne*",
"boost": 1
}
}
}
}
}
}
对于多字段查询,您可能可以使用它,query_string
所以基本上您的解决方案是query_string
在nested query
.
请求参数:
POST <your_index_name>/_search
{
"query": {
"nested": {
"path": "messages",
"query": {
"query_string": {
"fields": ["messages.message", "messages.subject"],
"query": "*nne*",
"boost": 1
}
}
}
}
}
查询 DSL
您也可以使用wildcard
usingQuery DSL
但同样,您需要为每个字段添加多个查询子句,出于性能原因,我怀疑通配符查询不支持多字段查询。
POST <your_index_name>/_search
{
"query": {
"nested": {
"path": "messages",
"query": {
"bool": {
"should": [
{
"wildcard": {
"messages.message": {
"value": "*nne*",
"boost": 1
}
}
},
{
"wildcard": {
"messages.subject": {
"value": "*nne*",
"boost": 1
}
}
}
]
}
}
}
}
}
请注意,不建议使用通配符搜索,因为它必须执行的正则表达式操作的数量会影响您获得响应的延迟,相反,我建议您查看Ngram Tokenizer从而您可以使用简单的匹配查询来得到你想要的结果。
让我知道这是否有帮助!