Elasticsearch: найти точное совпадение в массиве - PullRequest
0 голосов
/ 22 января 2019

У меня есть следующие документы:

{
    ...
    _source: {
        id: 1, 
        tags: [
            "xxx"
        ]
    }
},
{
     ...
     _source: {
         id: 2, 
         tags: [
             "xxx yyy"
         ]
     }
}

Как мне найти "xxx", если я хочу получить только первый документ?

Я пробовал это:

"query" : {
    "filter" : {
        "term" : { 
           "tags" : "xxx"
        }
    }
}

Но он вернулся с обоими документами.

1 Ответ

0 голосов
/ 23 января 2019

Ваша основная проблема в том, что вы не определили явное отображение, поэтому вступит в действие отображение по умолчанию. Предполагая, что вы работаете с последней версией 5 или 6.

При поиске в поле тегов анализируется текст, поэтому он создает для xxx yyy токенов xxx и yyy, которые соответствуют также вашему поиску.

GET _analyze
{
  "text": "xxx yyy"
}

Вы можете запросить мультиполе tags.keyword, которое даст вам точное совпадение (значение поля не анализируется). Например:

GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "tags.keyword": "xxx"
        }
      }
    }
  }
}

Или другая возможность, и, делая это с самого начала, используйте только тип ключевого слова. tags обычно имеют тип keyword или не анализируются.

Определить отображение

PUT test
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "doc": {
      "properties": {
        "tags": {
          "type": "keyword"
        }
      }
    }
  }
}

PUT test/doc/1
{
  "tags": [
    "xxx"
  ]
}
PUT test/doc/2
{
  "tags": [
    "xxx yyy"
  ]
}

Используя приведенное выше сопоставление, вы можете искать tags затем.

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