如何对两种不同的数据类型执行搜索查询?

How to perform search query on two different data types?

我的查询非常简单,为了让它更简单,假设我只搜索两个字段,name(text) & age(long):

GET person_db/person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase_prefix": {
            "name": "hank"
          }
        },
        {
          "match_phrase_prefix": {
            "age": "hank"
          }
        }
      ],
      "minimum_should_match": 1,
      "boost": 1.0
    }
  }
}

如果我搜索“23”,没问题,elastic 知道如何将其更改为数字并且不会失败,但如果搜索输入是 "john",我会收到错误 400 "reason": "failed to create query: {\n \"bool\....".

遇到这种情况我该怎么办?

我想过在插入es之前把数值型的值改成字符串,但是尽量避免,我觉得es应该有办法支持。

欣赏

此查询有效:(感谢@jmlw)

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "alt",
            "type": "phrase_prefix",
            "fields": [
              "name",
              "taxid",
              "providers.providerAddress.street"
            ],
            "lenient": true
          }
        }
      ],
      "minimum_should_match": 1,
      "boost": 1.0
    }
  }
}

没有您的文档或映射的详细信息,我的第一个猜测是 age 字段被 Elasticsearch 解释为数字字段。传入除 'number' 类型以外的任何其他类型,或可以转换为数字的内容将导致查询失败,某些异常报告无法将您的字符串转换为数字。

话虽如此,您可以尝试将 lenient: true 添加到您的 match_phrase_prefix 搜索词中,这将允许 Elasticsearch 忽略转换为数字类型的失败,并从搜索中删除该词.

另一种方法是只允许用户查询同一类型的多个字段,或者指定他们想在哪个字段中查询什么数据。 IE。我是一名用户,我想搜索 age 为 23 且有 name John 的人,而不是输入 23 John 或类似内容。

否则,您可能需要预处理查询字符串,拆分搜索词并将它们单独传递到搜索子句中 lenient: true 以尝试在具有不同数据类型的多个字段中搜索多个词。

您也可以尝试使用不同的搜索类型,例如 multi_matchquery_stringsimple_query_string,因为它们可能会更灵活地满足您的需求。