当我进行此查询时:
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。 知道发生了什么吗?
答案 0 :(得分:1)
假设您的句子如下
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.*
将按预期工作。
您总是搜索反向索引,因此您只会得到反向索引存储的内容
如果您既需要部分搜索又需要精确的搜索实现,那么我建议您将main_text
的{{3}}或您想要使用的任何字段名称都使用。
希望这会有所帮助!
答案 1 :(得分:0)
这是因为正则表达式是术语查询而不是全文查询。 您可能正在使用空白令牌生成器,然后找不到包含空白的令牌