弹性搜索中的条件查询搜索

问题描述 投票:0回答:1

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

[
  {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。如果不存在昵称,则应使用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. 基于条件的搜索,如果存在昵称,并且即使firstName与搜索文本匹配,它也不应在搜索中包括该文档
  2. 如果没有昵称,则按名字搜索

感谢您的任何帮助。

elasticsearch elasticsearch-dsl elasticsearch-relavance
1个回答
0
投票

查询

{
  "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
        ]
      }
    ]
© www.soinside.com 2019 - 2024. All rights reserved.