首页 > 解决方案 > 查询多个单词时,通配符无法按预期工作

问题描述

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

"*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*”。

所以看起来在使用空格和破折号时会出现问题。谁能帮我解决这个问题?

标签: elasticsearchlucenelogstash

解决方案


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

基本上,对于“被调用”之类的查询,您不需要通配符。只需使用一个短语查询,如:

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

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

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

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

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

如果您想查找所有包含“call”、“calling”或“calling”的文档。


对于像 NP-00121 这样的值或 URI,如果不分析这些字段可能会更有用。因为这些被分成令牌('np'和'00121'),所以你看到的问题。您可以将这些字段索引为“关键字”类型而不是“文本”,以将整个字段索引为单个未分析的标记。


推荐阅读