Отключить поиск по некоторым полям в эластичном поиске

#python #amazon-web-services #elasticsearch

#python #amazon-веб-сервисы #elasticsearch

Вопрос:

Я хочу включить поиск только в одном поле «XYZ». Я использую следующий код, но он выдает ошибку. Не могли бы вы, пожалуйста, помочь мне с этим?

 {
  "dynamic": "false",
  "properties": {
    "ABC": {
      "type": "text",
      "index": false,
      "store": true
      
    },
    "PQR": {
      "type": "text",
       "index": false,
      "store": true
    },
    "XYZ": {
      "type": "text"
    }
  }
}
  

PS Я хочу, чтобы поля «ABC» и «PQR» сохранялись в эластичном поиске, но я также хочу отключить поиск по этим полям.

Ответ №1:

Вы можете использовать параметр enabled mapping

Включенный параметр, который может применяться только к определению сопоставления верхнего уровня и полям объекта, приводит к тому, что Elasticsearch полностью пропускает синтаксический анализ содержимого поля. JSON все еще может быть извлечен из поля _source, но он недоступен для поиска или сохранен каким-либо другим способом:

Сопоставление индексов:

 {
  "mappings": {
    "properties": {
      "ABC": {
        "enabled":false
      },
      "PQR": {
        "enabled":false
      },
      "XYZ": {
        "type": "text"
      }
    }
  }
}
  

Индексировать данные:

 {
    "ABC": "b",
    "PQR": "c",
    "XYZ": "a"
}
  

Поисковый запрос:
При поиске по PQR полю результатов поиска нет.

 {
  "query": {
    "match": {
      "PQR": {
        "query": "c"
      }
    }
  }
}
  

Результат поиска:

 "hits": {
    "total": {
      "value": 0,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  }
  

Поисковый запрос:

 {
  "query": {
    "match": {
      "XYZ": {
        "query": "a"
      }
    }
  }
}
  

Результат поиска:

 "hits": [
      {
        "_index": "stof_64113718",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.13353139,
        "_source": {
          "ABC": "b",
          "PQR": "c",
          "XYZ": "a"
        }
      }
    ]
  

Комментарии:

1. Я хочу, чтобы поля «ABC» и «PQR» сохранялись в эластичном поиске, но я также хочу отключить поиск по этим полям.

Ответ №2:

Похоже, вы получаете исключение ниже:

«причина»: «не удалось создать запрос: невозможно выполнить поиск по полю [PQR], поскольку оно не проиндексировано».,

И это правильно, так как для поиска он должен быть проиндексирован, что контролируется параметром index, который вы установили как false .

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

Ответ №3:

Я считаю, что вы неправильно используете синтаксис :

 PUT indexName
{
  "mappings": { // <=============== This is missing
    "dynamic": false,
    "properties": {
      "ABC": {
        "type": "text", //<============= If type is object, use 'enabled' instead of 'index' 
        "index": false, 
        "store": true
      },
      "PQR": {
        "type": "text",
        "index": false,
        "store": true
      },
      "XYZ": {
        "type": "text"
      }
    }
  }
}
  

Примечание:

  1. enabled = false обычно используется с полями типа object

  2. index = false используется с предопределенными типами, такими как text и т. Д

  3. Оба index=false amp; enabled=false сделают поле неиндексируемым, но поле все равно будет присутствовать в _source .

  4. Для полей, где index=false, любые поисковые запросы по этим полям приведут к следующей ошибке :

      Cannot search on-field [xyz] since it is not indexed
      
  5. Для любых полей (type= object), где enabled = false, любые поисковые запросы по этим полям не приведут ни к какой ошибке.