Как сопоставить имя и фамилию с Elasticsearch? - PullRequest
0 голосов
/ 22 октября 2019

Типичный ответ Elasticsearch JSON выглядит примерно так:

[
    {
        "_index": "articles",
        "_id": "993",
        "_score": 10.443843,
        "_source": {
            "title": "This is a test title",
            "authors": [
                 {
                      first_name: 'john',
                      last_name: 'smith'
                 },

Как я могу запросить все статьи, одним из авторов которых является 'Джон Смит'? В настоящее время у меня есть:

        const {
            hits: { hits }
        } = await client.search({
            index: "articles",
            body: {
                query: {
                    bool: {
                        should: [
                            {
                                match: {
                                    "authors.first_name": "john"
                                }
                            },
                            {
                                match: {
                                    "authors.first_name": "Smith"
                                }
                            }
                        ]
                    }
                }
            }
        });

Но здесь возвращаются статьи, в которых имя или фамилия - Джон или Смит, а не статьи с автором "Джон Смит".

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Я думаю, что вы сталкиваетесь с вложенной или объектной дилеммой здесь. Вы можете достичь того, что ищете, изменив тип поля authors на вложенный тип (вы не предоставили отображение индекса, поэтому я предполагаю, что здесь), и воспользовавшись этим запросом

{
   "query":{
      "nested":{
         "path":"authors",
         "query":{
            "bool":{
               "must":[
                  {
                     "match":{
                        "authors.firstName":{
                           "query":"john"
                        }
                     }
                  },
                  {
                     "match":{
                        "authors.lastName":{
                           "query":"Smith"
                        }
                     }
                  }
               ]
            }
         }
      }
   }
}

Надеюсьэто помогает.

0 голосов
/ 22 октября 2019

Что ж, в этом случае вы используете оператор "must", который можно объяснить как

firstname:john OR lastname:smith

, вместо этого это можно легко исправить с помощью слова "must", которое можно объяснить как

firstname:john AND lastname:smith

Также, как упоминает Роб в своем ответе, вложенный vs объект действительно является дилеммой.

, но эта дилемма может возникнуть, когда вы обрабатываете массивы информации.

, например, вывведите следующую запись

запись # 1

   {
      "serviceType": "mysql",
      "allowedUsers": [
        {
          "firstName": "Daniel",
          "lastName": "Acevedo"
        },
        {
          "firstName": "John",
          "lastName": "Smith"
        },
        {
          "firstName": "Mike",
          "lastName": "K"
        }
      ]
    }

, и вы выполните следующий поиск

{
  "size": 10,
  "query": {
    "query_string": {
      "query": "firstName:john AND lastName:acevedo"
    }
  }
}

, и вы получите совпадение в документе, потому что, как firstName, так иlastName соответствует вашему документу, даже если они совпадают в разных пользовательских объектах. это пример сопоставления OBJECT.

в этом случае обходного пути нет, и вы должны использовать отображение NESTED для достижения естественного совпадения.

в вашем конкретном случае, я не думаю, чтоВы сталкиваетесь с этим, поэтому, выполняя запрос OBJECT и MUST (И вместо того, чтобы (ИЛИ)), вы должны справиться.

, если вам нужны дополнительные объяснения, дайте мне знать, что я внесу изменения с более подробной информацией.

ура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...