поле упругого поиска copy_to не заполнено - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь скопировать главное поле заголовка в Elastic Search 5.6, в другое поле с: index: false, чтобы я мог использовать это поле для соответствия точному значению.

Тем не менее. После переиндексации и выполнения поиска с помощью _source: ["correct_hoofdtitel»] поле «точный_хофдтитель» не заполняется значением «hoofdtitel».

PUT producten_prd_5_test
{
 "aliases": {},
 "mappings": {
   "boek": {
     "properties": {
       "hoofdtitel": {
         "type": "text",
         "copy_to": [
           "suggest-hoofdtitel", "exact_hoofdtitel"
         ]
       },
       "suggest-hoofdtitel": {
         "type": "completion",
         "analyzer": "simple",
         "preserve_separators": false,
         "preserve_position_increments": true,
         "max_input_length": 50
       },
       "exact_hoofdtitel":{
         "type":"text",
         "fields":{
           "keyword":{
             "type":"keyword",
             "index":false
           }
         }
       },
     }
   }
 },
 "settings": {
   "number_of_shards": "1",
   "number_of_replicas": "0"
 }
}


GET producten_prd_5_test/_search
{
  "_source":["hoofdtitel","exact_hoofdtitel"]
}


hits": [
      {
        "_index": "producten_prd_5_test",
        "_type": "boek",
        "_id": "9781138340671",
        "_score": 1,
        "_source": {
          "hoofdtitel": "The Nature of the Firm in the Oil Industry"
        }
      },

1 Ответ

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

Я считаю, что вы можете достичь того, что вы хотите без copy_to. Позвольте мне показать вам, как и почему вам это не нужно.

Как сделать полнотекстовый запрос и запрос на точное совпадение в одном поле?

Это можно сделать с помощью атрибута отображения fields. В основном со следующим фрагментом отображения:

PUT producten_prd_5_test_new
{
  "aliases": {},
  "mappings": {
    "boek": {
      "properties": {
        "hoofdtitel": {
          "type": "text", <== analysing for full text search
          "fields": {
            "keyword": {
              "type": "keyword" <== analysing for exact match
            },
            "suggest": {  
              "type": "completion",  <== analysing for suggest
              "analyzer": "simple",
              "preserve_separators": false,
              "preserve_position_increments": true,
              "max_input_length": 50
            }
          }
        }
      }
    }
  }
}

вы будете указывать Elasticsearch индексировать одно и то же поле три раза: один для полнотекстового поиска, один для точного соответствия и один для подсказки.

Точный поиск можно будет выполнить с помощью запроса term , например:

GET producten_prd_5_test_new/_search
{
  "query": {
    "term": {
      "hoofdtitel.keyword": "The Nature of the Firm in the Oil Industry"
    }
  }
}

Почему поле exact_hoofdtitel не появляется в возвращенном документе?

Поскольку copy_to не меняет источник:

Исходное поле _source не будет изменено, чтобы показать скопированное значения.

Работает как поле _all, что позволяет объединять значения нескольких полей в одном воображаемом поле и анализировать его особым образом.

Имеет ли смысл вводить copy_to в поле index: false?

При index: false поле не будет проанализировано и не будет доступно для поиска (как в вашем примере, поле exact_hoofdtitel.keyword).

Может все же иметь смысл сделать это, если вы хотите выполнить агрегирование ключевых слов в этом поле:

GET producten_prd_5_test/_search
{
  "aggs": {
    "by copy to": {
      "terms": {
        "field": "exact_hoofdtitel.keyword"
      }
    }
  }
}

Это вернет что-то вроде:

{
  "aggregations": {
    "by copy to": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "The Nature of the Firm in the Oil Industry",
          "doc_count": 1
        }
      ]
    }
  }
}

Надеюсь, это поможет!

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