используя термины вasticsearch js - PullRequest
1 голос
/ 17 октября 2019

из-за замечательной документации, которую имеет Elasticsearch, я не могу определить правильный синтаксис для поиска термина, это мой код:

  let checkuser = await client.search({
        index: "users",
        type: "my_users",
        body: {
          query: {
            term: {
              email: req.body.email
            }
          }
        }
      });

Я хочу найти объект, имеющий ключевое значениепара 'email' с определенным письмом, но я хочу, чтобы это было именно то письмо, которое я написал, если его a@mail.com ab@mail.com не должно совпадать, я знаю, что мне нужно использовать термины, но когда я пишу этовроде бы это не работает, что не так с моим синтаксисом?

PS это мое отображение индекса:

  "users" : {
    "mappings" : {
      "jobix_users" : {
        "properties" : {
          "confirmed" : {
            "type" : "boolean"
          },
          "email" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "firstName" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "jobNotification" : {
            "type" : "boolean"
          },
          "jobTitle" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "lastName" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "password" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "userName" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    }
  }

1 Ответ

2 голосов
/ 17 октября 2019

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

Как вы можете видеть в поле электронной почты сопоставления, есть две интерпретации:

  1. текст
  2. ключевое слово

В текстовом стандартном токенизаторе есть работа и сохранение токенов в вашем индексе. Это означает, что вы можете найти для термина alex и для термина mail.com. Если вы хотите найти всю электронную почту, тогда ваш запрос должен выглядеть следующим образом:

{
    "query": {
        "term": {
            "email.keyword": req.body.email
        }
    }
}   

Но у эластичного поиска есть специальный uax_url_email tokenizer для URL и писем. Я хотел бы рекомендовать использовать этот токенизатор для поля электронной почты.

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