通配符在查询多个单词时无法按预期工作



如果我在"消息"字段中搜索包含例如"调用"的文档,我会得到预期的结果,但是当我搜索"被调用","被调用*"或

"*was called*"

我一无所获,尽管我有很多文档的消息字段包含以下内容"应用程序由 REST API 调用"。

这是我发送的查询的一部分:

"wildcard": {
"message": {
"wildcard": "was called",
"boost": 1.0
}
}

以下是映射的一部分:

"mappings": {
"doc": {
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"match_mapping_type": "string",
"mapping": {
"norms": false,
"type": "text"
}
}
},
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"norms": false,
"type": "text"
}
}
}
],
"properties": {
...
"message": {
"type": "text",
"norms": false
}
}
}
}

我搜索的索引是由 Logstash 自动创建的。

我在另一个领域也有类似的问题;我在字段中有以下值:"NP-00121"。*00121 有效,但 *-00121 无效。

编辑:还有一个例子:我有一个"requestUri"字段,其中包含"/api/v1/log/rest"、"/api/v1/log/notification"等,当我发送以下通配符查询时,我什么也没得到"/api/v1*"。

因此,使用空格和破折号时似乎出现问题。谁能帮我解决这个问题?

通配符在令牌中使用。您的消息字段被索引为文本,因此将被标记为单词。

基本上,您不需要通配符来查询"被调用"。只需使用短语查询,例如:

"query": {
"match_phrase" : {
"message" : "was called"
}
}

或者,如果您更喜欢查询字符串查询:

"query": {
"query_string" : {
"query" : "message:"was called""
}
}

通配符查询对于搜索部分术语很有用,例如:

"query": {
"wildcard" : { "message" : "call*" }
}

如果您想查找包含"呼叫"、"呼叫"或"呼叫"的所有文档。


对于 NP-00121 等值或 URI,如果不分析这些字段,可能会更有用。由于这些被分成标记("np"和"00121"(,因此您看到的问题。您可以将这些字段索引为"关键字"类型而不是"文本",以便将整个字段作为单个未分析的标记编制索引。

最新更新