【问题标题】:Handle Optional field search in Elasticsearch处理 Elasticsearch 中的可选字段搜索
【发布时间】:2021-05-18 14:19:28
【问题描述】:

我是查询弹性搜索的新手。我有一个问题,我花了很长时间才进行研究和实施。 我有 4 个要搜索的字段,但在搜索时并非必须选择所有字段,有些字段可以留空。 例如,员工名字、员工姓氏、职位和部门。我会执行搜索这样的用例:只需输入名字和姓氏就可以让所有人都有这个名字和姓氏,或者我可以选择姓氏+名字+职位,或者我可以选择姓氏和部门等等参数留空。 任何人都对查询有想法。我会很感激任何建议。 谢谢

【问题讨论】:

  • 您的意思是您的用户填写他们想要搜索的字段吗?
  • 是的,正确,他们可以选择所有字段或部分字段@ShiraElitzur

标签: elasticsearch search


【解决方案1】:

实现您的用例的一种方法是使用 bool 查询或 query_string

添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

{
  "mappings": {
    "properties": {
      "department": {
        "type": "text"
      },
      "fname": {
        "type": "text"
      },
      "lname": {
        "type": "text"
      },
      "title": {
        "type": "text"
      }
    }
  }
}

索引数据:

{
  "fname": "john",
  "title": "faculty",
  "department": "navy"
}
{
  "fname": "smith",
  "title": "faculty",
  "department": "navy"
}
{
  "fname": "Will",
  "lname": "Smith",
  "title": "Student",
  "department": "engineering"
}

使用bool query进行搜索查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "fname": "Smith"
          }
        },
        {
          "match": {
            "title": "faculty"
          }
        },
        {
          "match": {
            "department": "navy"
          }
        }
      ]
    }
  }
}

搜索结果将是

"hits": [
      {
        "_index": "67550433",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.9208363,
        "_source": {
          "fname": "Smith",
          "title": "faculty",
          "department": "navy"
        }
      }
    ]

或者你甚至可以使用query_string

{
  "query":{
    "query_string":{
      "query":"fname:smith AND title:faculty AND department:navy"
    }
  }
}

【讨论】:

  • @Sam Luong 请仔细阅读答案,如果这能解决您的问题,请告诉我?
  • 感谢您的回复。但是在查询中,我们不知道用户会选择哪个字段进行搜索。例如,有时,使用只选择名字和姓氏来搜索并将其他字段留空,有时,您会选择姓氏和部门来搜索并将其他字段留空,有时,您可以选择3个字段,我们不会知道哪个场地。我像以前一样尝试了 bool 查询,但是当我在值中留空(通过空字符串或 null)时,它给出了一些错误
  • 所有索引数据都有4个字段,但是在搜索查询中,并不是所有4个字段都是一直需要的,选择的字段应该进行AND运算
【解决方案2】:

您可以通过编程方式构建查询,作为带有“必须”键的键值哈希,并通过循环输入字段类型,仅在提供的情况下将您的字段添加到“必须”。 或者,您可以将所有字段置于“应该”下,假设不会为空白值找到匹配项,因此不会影响分数和结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 2017-05-25
    • 1970-01-01
    • 2021-03-10
    • 2020-09-12
    • 1970-01-01
    • 2018-12-28
    • 2018-10-12
    相关资源
    最近更新 更多