regex - Elasticsearch 通配符、正则表达式、match_phrase、前缀查询返回错误结果
问题描述
我刚刚开始使用 Elasticsearch,版本 7.5.1。
我想查询以特定单词片段开头的结果。例如tho * 应该返回包含以下内容的数据:
思想,汤姆森,那些,等等。
我试过 -
- 正则表达式
[{'regexp':{'f1':'tho.*'}},{'regexp':{'f2':'tho.*'}}]
- 通配符
[{'wildcard':{'f1':'tho*'}},{'wildcard':{'f2':'tho*'}}]
- 字首
[{'prefix':{'f1':'tho'}},{'prefix':{'f2':'tho'}}]
- 匹配短语
'multi_match': {'query': 'tho', 'fields':[f1,f2,f3], 'type':phrase}
# also tried with type phrase_prefix
所有这些都返回正确的结果,但它们也都返回单词method。
同样cat * 正在返回单词communication。
我做错了什么?这与分析器有关吗?
- 编辑-这是字段映射-
'f1': {
'full_name': 'f1',
'mapping': {
'f1': {
'type': 'text',
'analyzer': 'some_analyzer',
'index_phrases': true
}
}
},
解决方案
由于您没有提供任何索引映射,并且如前所述,您method
也在搜索结果中。我认为您设置的分析器存在一些问题。
一种可能性是您设置了 ngram tokenizer,它对单词进行标记,并产生标记tho
(因为所有单词都tho
存在于其中)
添加具有索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"mappings": {
"properties": {
"f1": {
"type": "text"
}
}
}
}
指数数据:
{
"f1": "method"
}
{
"f1": "thought"
}
{
"f1": "Thomson"
}
{
"f1": "those"
}
使用通配符查询的搜索查询:
{
"query": {
"wildcard": {
"f1": {
"value": "tho*"
}
}
}
}
使用前缀查询搜索查询:
{
"query": {
"prefix": {
"f1": {
"value": "tho"
}
}
}
}
使用 Regexp 查询搜索查询:
{
"query": {
"regexp": {
"f1": {
"value": "tho.*"
}
}
}
}
使用匹配短语前缀查询搜索 QUEery:
{
"query": {
"match_phrase_prefix": {
"f1": {
"query": "tho"
}
}
}
}
以上 4 个查询的搜索结果均为
"hits": [
{
"_index": "67673694",
"_type": "_doc",
"_id": "1",
"_score": 1.2039728,
"_source": {
"f1": "thought"
}
},
{
"_index": "67673694",
"_type": "_doc",
"_id": "2",
"_score": 1.2039728,
"_source": {
"f1": "Thomson"
}
},
{
"_index": "67673694",
"_type": "_doc",
"_id": "3",
"_score": 1.2039728,
"_source": {
"f1": "those"
}
}
]
推荐阅读
- python - 如何在python中的某个单词之后提取字符串?
- python - 试图使它成为您可以从列表中选择书籍的地方,然后在最后使用 python 给出分项收据
- r - ggplot 清理堆积条形图上的 y 轴
- http - multipart/form-data 是一次性还是以流的形式发送整个文件数据
- python - 有效地查询 pandas.DataFrame 中的大量布尔列
- javascript - PHP:关联数组到数值数组
- php - 检查 MySQL 语句是读取还是写入
- android - 在事件表 Google 日历 Android 中更新 SELF_ATTENDEES_STATUS 时出错
- html5-canvas - 如何在 html 画布饼图中绘制弯曲的文本
- python - Python 访问循环的正确值