Параметры сопоставления Elasticsearch: индекс против включен - PullRequest
0 голосов
/ 13 июня 2018

Я боролся с двумя параметрами отображения эластичного поиска: index и enabled.Я использую Elasticsearch 6.2.4.


Вот мой случай.

Отображение

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "user_id": {
          "type":  "keyword"
        },
        "last_updated": {
          "type": "date"
        },
        "session_data_index_false": { 
          "index" : false,
          "type" : "keyword"
        },
        "session_data_enabled_false": { 
          "enabled" : false
        }
      }
    }
  }
}

Индексирование

PUT my_index/_doc/1
{
  "user_id": "jpountz",
  "session_data_index_false": "hello", 
  "session_data_enabled_false": "hello", 
  "last_updated": "2015-12-06T18:22:13"
}

Поиск1

GET my_index/_search
{
  "query": {
    "match": {
      "session_data_index_false": "hello"
    }
  }
}

Я получил ошибку 400 со следующим сообщением.

{
  "error": {
    "root_cause": [
      {
        "type": "query_shard_exception",
        "reason": "failed to create query: {\n  \"match\" : {\n    \"session_data_index_false\" : {\n      \"query\" : \"hello\",\n      \"operator\" : \"OR\",\n      \"prefix_length\" : 0,\n      \"max_expansions\" : 50,\n      \"fuzzy_transpositions\" : true,\n      \"lenient\" : false,\n      \"zero_terms_query\" : \"NONE\",\n      \"auto_generate_synonyms_phrase_query\" : true,\n      \"boost\" : 1.0\n    }\n  }\n}",
        "index_uuid": "6ByxNrjIRQmF23zcmKOvUA",
        "index": "my_index"
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "my_index",
        "node": "DYPnEJWjTtm58oxZ9F-RSg",
        "reason": {
          "type": "query_shard_exception",
          "reason": "failed to create query: {\n  \"match\" : {\n    \"session_data_index_false\" : {\n      \"query\" : \"hello\",\n      \"operator\" : \"OR\",\n      \"prefix_length\" : 0,\n      \"max_expansions\" : 50,\n      \"fuzzy_transpositions\" : true,\n      \"lenient\" : false,\n      \"zero_terms_query\" : \"NONE\",\n      \"auto_generate_synonyms_phrase_query\" : true,\n      \"boost\" : 1.0\n    }\n  }\n}",
          "index_uuid": "6ByxNrjIRQmF23zcmKOvUA",
          "index": "my_index",
          "caused_by": {
            "type": "illegal_argument_exception",
            "reason": "Cannot search on field [session_data_index_false] since it is not indexed."
          }
        }
      }
    ]
  },
  "status": 400

Поиск2

GET my_index/_search
{
  "query": {
    "match": {
      "session_data_enabled_false": "hello"
    }
  }
}

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

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

Извлечение

GET my_index/_doc/1

Конечно, я мог получить исходные данные.

{
  "_index": "my_index",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "user_id": "jpountz",
    "session_data_index_false": "hello",
    "session_data_enabled_false": "hello",
    "last_updated": "2015-12-06T18:22:13"
  }
}

Я читаю официальные документы по указанным выше параметрам.

А также, я прочитал эту статью , но обнаружил, что она совместима сasticsearch 1.5.

Кто-нибудь здесь знает о том, как эти два вариантаотличаются друг от друга?

Заранее спасибо.

Лучший

1 Ответ

0 голосов
/ 13 июня 2018

Если для enabled установлено значение false, вы указываете ES полностью игнорировать синтаксический анализ поля, поэтому он не будет ни анализироваться, ни индексироваться, ни сохраняться (за исключением, конечно, поля _source).

Итак, ES даже не знает, что поле существует, и, таким образом, оно обрабатывает этот случай, как будто вы запрашиваете любое другое несуществующее поле, в основном, как если бы источник даже не содержал поле.Результат: ES не возвращает никаких документов.

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

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