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。知道发生了什么吗?
解决方案
假设您有以下句子
word raincoat bword wordcd
如果该字段main_text
是 typetext
并且如果它使用默认 ie Standard Analyzer
,那么该句子将被分解为以下标记
word
raincoat
bword
wordcd
(是的,没有空格)
现在这些单词实际上存储在倒排索引中,当您使用匹配甚至正则表达式进行查询时,它会尝试匹配这些单词。
请注意,它不会按原样保存句子,例如,也不会在倒排索引"word raincoat"
中保存为(注意空格)。"word "
现在您正在使用正则表达式.*word.*
,您将获得具有word
,bword
和wordcd
' 因为这就是您的倒排索引的文档。
现在再次使用 regex 时.*word r*
,由于倒排索引不会将它们保存"word raincoat"
在一起,因此您不会得到结果。
您可以做的是,拥有main_text
type字段keyword
,在这种情况下,数据类型keyword
不会经过分析阶段,因此将整个值按原样保存在倒排索引中。您的 regex*.word r.*
将按预期工作。
你总是搜索倒排索引,所以你只会得到倒排索引存储的内容
如果您需要部分搜索和精确搜索实现,那么我建议您使用多字段main_text
或您打算使用的任何字段名称。
希望这可以帮助!
推荐阅读
- ios - 使用 Animation + UIStackView 更改 tableviewSection 内 HeaderView 的高度
- networking - 客户端到 k8s 集群之间的连接问题 [TCP-reset-by-server]
- css - 狂欢电子商务 - 无法覆盖 css
- java - 使用多线程更新 GUI
- c++ - 采用右值参数的函数
- javascript - 将 jQuery 克隆的虚拟元素数组转换为单个对象
- java - 共享偏好消失
- python - 如何根据熊猫中的数值数据分析分类数据?
- assembly - 为什么我在调试器中看不到地址布局随机化?
- angular - 如何从另一个角度组件激活一个组件中的 rxjs 订阅者?