Поиск по условному запросу в эласти c поиск - PullRequest
0 голосов
/ 25 мая 2020

У меня есть следующий документ в elasti c индексы / кластеры поиска

[
  {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'}

];

Мое требование поиска, которое похоже на поиск контактов на мобильном телефоне:

Релевантный поиск должен начинаться сначала с ником затем lastName. Если никнейм не указан, он должен искать по firstName с AS C порядком сортировки

Текст поиска: John

Следовательно, результат поиска должен быть

[
  // 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"]

                }
            }]
        }
    }


}

Я не могу охватить следующий сценарий ios:

  1. Поиск на основе условий, если присутствует никнейм и даже если firstName совпадает с поисковым текстом, он не должен включать этот документ в поиск
  2. Поиск по firstName, если никнейм не указан

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 26 мая 2020

Запрос

{
  "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
        ]
      }
    ]
...