当我进行此查询时:

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.*"
        }
    }
}
'

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

最佳答案

假设您有以下句子
word raincoat bword wordcd
如果main_text字段的类型为text并且使用默认值即Standard Analyzer,则该句子将被分解为以下标记
wordraincoatbwordwordcd
(是的,没有空格)

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

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

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

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

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

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

如果您既需要部分搜索又需要精确的搜索实现,那么我建议您将multi-field用作main_text或您想要使用的任何字段名称。

希望这可以帮助!

关于elasticsearch - 在正则表达式查询中使用空格时没有结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51576193/

10-17 03:05