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

时间:2018-07-27 14:02:50

标签: elasticsearch elasticsearch-5 elasticsearch-aggregation

我的查询非常简单,为了使其更简单,可以说我只搜索两个字段,即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
    }
  }
}

1 个答案:

答案 0 :(得分:1)

没有您的文档或映射的详细信息,我的第一个猜测是age字段被Elasticsearch解释为数字字段。传递除“数字”类型以外的任何内容或可以转换为数字的内容都会导致查询失败,但有些例外会报告将字符串转换为数字失败。

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

另一种方法是仅允许用户在相同类型的多个字段上进行查询,或指定他们希望在哪个字段中查询哪些数据。即我是用户,我想搜索age为23并拥有name John的用户,而不是输入23 John或类似名称。

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

您还可以尝试使用其他搜索类型,例如multi_matchquery_stringsimple_query_string,因为这些搜索类型可能会为您要执行的操作提供更大的灵活性。