查询超过一个单词时,通配符无法正常工作

时间:2018-08-22 14:04:00

标签: elasticsearch lucene logstash

如果我在“邮件”字段中搜索包含例如“被叫”的文档,则会得到预期结果,但是当我搜索“被叫”,“被叫*”或

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

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

1 个答案:

答案 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"类型而不是“文本”,以便将整个字段索引为一个未经分析的标记。