【问题标题】:Conditional query search in elastic search弹性搜索中的条件查询搜索
【发布时间】:2020-09-12 07:04:54
【问题描述】:

我在弹性搜索索引/集群中有以下文档

[
  {id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
  {id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
  {id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
  {id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
  {id: 5, firstName: 'John', lastName: 'Doe'},
  //should not search this
  {id: 6, firstName: 'John', lastName: 'Glow', nickName: 'NonSearchText'}

];

我的搜索要求类似于移动设备中的联系人搜索:

相关搜索应首先使用 nickName,然后是 lastName。如果 nickName 不存在,那么它应该按照 ASC 排序顺序搜索 firstName

搜索文字:约翰

因此查询搜索结果应该是

[
  // search with nickName as higher relevance and then sorted it
  {id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
  {id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
  // search with lastName as second higher relevance and then sorted it
  {id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
  {id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
  // search with firstName as nickName is null
  {id: 5, firstName: 'John', lastName: 'Doe'},

  // and omitted one record

];

查询写入:

{
    "sort" : [

        {"lastName.keyword": "asc"},
        {"nickName.keyword": "asc"}
    ],
    "query": {
        "bool": {
            "must": [{

                "query_string": {
                    "query": "John*",
                    "analyze_wildcard": "true",
                    "fields": ["nickName^3", "lastName^2"]

                }
            }]
        }
    }


}

我无法涵盖以下场景:

  1. 如果存在 nickName 并且即使 firstName 与搜索文本匹配,则基于条件的搜索也不应该在搜索中包含该文档
  2. 如果昵称不存在,则按名字搜索

感谢任何帮助。

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl


    【解决方案1】:

    查询

    {
      "query": {
        "bool": {
          "should": [
            {
              "multi_match": {
                "query": "john",
                "fields": [
                  "nickName^3",
                  "lastName^2"
                ]
              }
            },
            {
              "bool": {
                "must_not": [
                  {
                    "exists": {
                      "field": "nickName"
                    }
                  }
                ],
                "must": [
                  {
                    "match": {
                      "firstName": "john"
                    }
                  }
                ]
              }
            }
          ]
        }
      },
      "sort": [
        {
          "_score": {
            "order": "desc"
          }
        },
        {
          "lastName.keyword": "asc"
        },
        {
          "nickName.keyword": "asc"
        }
      ]
    }
    

    结果

    "hits" : [
          {
            "_index" : "index73",
            "_type" : "_doc",
            "_id" : "MxvATnIB8mx5yKbJqLHv",
            "_score" : 2.6264062,
            "_source" : {
              "id" : 4,
              "firstName" : "Test",
              "lastName" : "Mason",
              "nickName" : "John"
            },
            "sort" : [
              2.6264062,
              "Mason",
              "John"
            ]
          },
          {
            "_index" : "index73",
            "_type" : "_doc",
            "_id" : "MhvATnIB8mx5yKbJmrG2",
            "_score" : 2.6264062,
            "_source" : {
              "id" : 3,
              "firstName" : "Test",
              "lastName" : "Zch",
              "nickName" : "John"
            },
            "sort" : [
              2.6264062,
              "Zch",
              "John"
            ]
          },
          {
            "_index" : "index73",
            "_type" : "_doc",
            "_id" : "MRvATnIB8mx5yKbJh7F7",
            "_score" : 2.059239,
            "_source" : {
              "id" : 2,
              "firstName" : "Test",
              "lastName" : "John",
              "nickName" : "Andrew"
            },
            "sort" : [
              2.059239,
              "John",
              "Andrew"
            ]
          },
          {
            "_index" : "index73",
            "_type" : "_doc",
            "_id" : "MBvATnIB8mx5yKbJcbG1",
            "_score" : 2.059239,
            "_source" : {
              "id" : 1,
              "firstName" : "User",
              "lastName" : "John",
              "nickName" : "Smith"
            },
            "sort" : [
              2.059239,
              "John",
              "Smith"
            ]
          },
          {
            "_index" : "index73",
            "_type" : "_doc",
            "_id" : "NBvATnIB8mx5yKbJubHP",
            "_score" : 1.0296195,
            "_source" : {
              "id" : 5,
              "firstName" : "John",
              "lastName" : "Doe"
            },
            "sort" : [
              1.0296195,
              "Doe",
              null
            ]
          }
        ]
    

    【讨论】:

    • 建议,你应该为你的答案提供解释,只是发布查询和结果不会有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2014-11-09
    • 2014-06-22
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多