Elasticsearch 通配符、regexp、match_phrase、前缀查询返回错误结果

问题描述

我刚刚开始使用 Elasticsearch,版本 7.5.1。

我想查询以特定单词片段开头的结果。 例如 tho* 应该返回包含以下内容的数据:

思想,汤姆森,那些,等等

我试过 -

  1. 正则表达式
[{'regexp':{'f1':'tho.*'}},{'regexp':{'f2':'tho.*'}}]
  1. 通配
[{'wildcard':{'f1':'tho*'}},{'wildcard':{'f2':'tho*'}}]
  1. 前缀
[{'prefix':{'f1':'tho'}},{'prefix':{'f2':'tho'}}]
  1. match_phrase
'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"
      }
    }
  }
}

使用正则表达式查询的搜索查询:

{
  "query": {
    "regexp": {
      "f1": {
        "value": "tho.*"
      }
    }
  }
}

使用匹配短语前缀查询搜索查询:

{
  "query": {
    "match_phrase_prefix": {
      "f1": {
        "query": "tho"
      }
    }
  }
}

以上 4 个查询的搜索结果是

"hits": [
      {
        "_index": "67673694","_type": "_doc","_id": "1","_score": 1.2039728,"_source": {
          "f1": "thought"
        }
      },{
        "_index": "67673694","_id": "2","_source": {
          "f1": "Thomson"
        }
      },"_id": "3","_source": {
          "f1": "those"
        }
      }
    ]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...