首页 > 解决方案 > 在正则表达式查询中使用空格时没有结果

问题描述

当我进行此查询时:

curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "regexp":{
            "main_text": ".*word r.*"
        }
    }
}
'

我没有得到任何结果。但是当我查询时:

curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "regexp":{
            "main_text": ".*word.*"
        }
    }
}
'

我得到带有单词的结果(包括带有“单词 r ...”的结果)。我正在使用 Elasticsearch 6.2.2。知道发生了什么吗?

标签: elasticsearch

解决方案


假设您有以下句子

word raincoat bword wordcd

如果该字段main_text是 typetext并且如果它使用默认 ie Standard Analyzer,那么该句子将被分解为以下标记

word raincoat bword wordcd

(是的,没有空格)

现在这些单词实际上存储在倒排索引中,当您使用匹配甚至正则表达式进行查询时,它会尝试匹配这些单词。

请注意,它不会按原样保存句子,例如,也不会在倒排索引"word raincoat"中保存为(注意空格)。"word "

现在您正在使用正则表达式.*word.*,您将获得具有word,bwordwordcd' 因为这就是您的倒排索引的文档。

现在再次使用 regex 时.*word r*,由于倒排索引不会将它们保存"word raincoat"在一起,因此您不会得到结果。

您可以做的是,拥有main_texttype字段keyword,在这种情况下,数据类型keyword不会经过分析阶段,因此将整个值按原样保存在倒排索引中。您的 regex*.word r.*将按预期工作。

你总是搜索倒排索引,所以你只会得到倒排索引存储的内容

如果您需要部分搜索和精确搜索实现,那么我建议您使用多字段main_text或您打算使用的任何字段名称。

希望这可以帮助!


推荐阅读