在正则表达式查询中使用空格时没有结果

时间:2018-07-29 00:07:14

标签: elasticsearch

当我进行此查询时:

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。 知道发生了什么吗?

2 个答案:

答案 0 :(得分:1)

假设您的句子如下

word raincoat bword wordcd

如果字段main_text的类型为text,并且使用默认值,即Standard Analyzer,则该句子将被分解为以下标记

word raincoat bword wordcd

(没有空格)

现在这些词实际上存储在倒排索引中,并且当您使用match甚至regex查询时,它将尝试匹配这些词。

请注意,它不会按原样保存句子。 "word raincoat"也不以倒排索引的形式另存为"word "(注意空格)。

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

现在再次使用正则表达式.*word r*时,由于倒排索引不会将"word raincoat"一起保存,因此不会得到结果。

您可以做的是,将字段main_text的类型为keyword,在这种情况下,数据类型keyword不会经过分析阶段,因此将整个值保存为处于倒排索引中。然后,您的正则表达式*.word r.*将按预期工作。

您总是搜索反向索引,因此您只会得到反向索引存储的内容

如果您既需要部分搜索又需要精确的搜索实现,那么我建议您将main_text的{​​{3}}或您想要使用的任何字段名称都使用。

希望这会有所帮助!

答案 1 :(得分:0)

这是因为正则表达式是术语查询而不是全文查询。 您可能正在使用空白令牌生成器,然后找不到包含空白的令牌