【问题标题】:How to perform search query on two different data types?如何对两种不同的数据类型进行搜索查询?
【发布时间】:2018-07-27 14:02:50
【问题描述】:

我的查询很简单,为了更简单,假设我只搜索两个字段,名称(文本)和年龄(长):

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\...."

在这种情况下我该怎么办?

我想过在insert到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
    }
  }
}

【问题讨论】:

  • 你能添加完整的错误吗?我怀疑 Es 不喜欢在数字字段中搜索文本值...
  • @Val 是的,我很确定,但是我该如何解决呢?当我构建查询时,我将客户端输入放在所有字段中......我不知道输入将是什么
  • 您可以尝试使用两个字段而不是单独的 match_phrase_prefix 子句来执行 multi_match of type phrase_prefix 吗?

标签: elasticsearch elasticsearch-5 elasticsearch-aggregation


【解决方案1】:

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

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

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

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

您也可以尝试使用不同的搜索类型,例如 multi_matchquery_stringsimple_query_string,因为它们可能对您想要做的事情有更大的灵活性。

【讨论】:

  • 感谢好友,感谢您的帮助,添加了可行的解决方案。让我知道您是否会在其中添加一些内容以使其更强大:) @jmlw
  • 一些小问题,也许你知道:我使用了phrase_prefix类型的查询,并且在文本的情况下效果很好,在数字上它只会拉出确切的数字......可能吗以某种方式编辑它?
  • 不幸的是,我不知道。您可以尝试在此 SO 帖子 [ElasticSearch multi_match query over multiple fields with Fuzziness ] (stackoverflow.com/questions/29632339/…) 中进行多匹配的模糊性参数,但我不确定它对数字数据的表现如何。
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多