当我进行此查询时:
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
,则该句子将被分解为以下标记word
raincoat
bword
wordcd
(是的,没有空格)
现在这些词实际上存储在倒排索引中,当您使用match甚至regex查询时,它将尝试匹配这些词。
请注意,它不会按原样保存句子。 "word raincoat"
也不以反向索引的形式另存为"word "
(注意空格)。
现在,您正在使用正则表达式.*word.*
,您将获得文档word
,bword
和wordcd
'coz,这就是倒排索引的含义。
现在再次使用正则表达式.*word r*
,因为倒排索引不会将"word raincoat"
一起保存,所以不会得到结果。
您可以做的是,将字段main_text
设置为keyword
类型,在这种情况下,数据类型keyword
不会经过分析阶段,因此将整个值保存为倒排索引。您的正则表达式*.word r.*
将会按预期工作。
您总是搜索倒排索引,因此您只会得到倒排索引存储的内容
如果您既需要部分搜索又需要精确的搜索实现,那么我建议您将multi-field用作main_text
或您想要使用的任何字段名称。
希望这可以帮助!
关于elasticsearch - 在正则表达式查询中使用空格时没有结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51576193/