如果我在“邮件”字段中搜索包含例如“被叫”的文档,则会得到预期结果,但是当我搜索“被叫”,“被叫*”或
"*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无效。
edit:还有一个示例:当我发送以下通配符查询时,我有一个“ requestUri”字段,其中包含“ / api / v1 / log / rest”,“ / api / v1 / log / notification”等。没有“ / api / v1 *”。
因此使用空格和破折号时似乎出现问题。谁能帮我解决这个问题?
答案 0 :(得分:0)
通配符用于令牌中。您的消息字段被索引为文本,因此将被标记为单词。
基本上,对于“被调用”之类的查询,您不需要通配符。只需使用phrase query,例如:
"query": {
"match_phrase" : {
"message" : "was called"
}
}
,或者如果您更喜欢query string query:
"query": {
"query_string" : {
"query" : "message:\"was called\""
}
}
通配符查询对于搜索部分字词非常有用,例如:
"query": {
"wildcard" : { "message" : "call*" }
}
如果要查找包含“通话”,“被通话”或“通话”的所有文档。
对于NP-00121之类的值或URI,如果不分析这些字段,则可能会更有用。因为它们正被分成令牌(“ np”和“ 00121”),因此您遇到的问题是。您可以将这些字段索引为"keyword"类型而不是“文本”,以便将整个字段索引为一个未经分析的标记。