#elasticsearch
#elasticsearch
Вопрос:
У меня есть случай, когда объект указывает размер каталога в случае, если он присутствует, в противном случае он выдает строку с надписью «IATEMPDIR не существует».
Есть ли какой-либо способ определить, не является ли значение объекта client.tempsize
lt 65594
amp;amp; client.tempsize
строкой (поэтому, когда оно имеет IATEMPDIR does not exist
значение, оно также должно возвращать этот запрос). В этом случае как мне проверить как диапазон чисел, так и есть ли строка?
я использую percolate
PUT /eg/.percolator/1
{
"sort": {
"rule.step": { "order": "asc" }
},
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"match": {
"client.name": "Athena"
}
},
{
"range": {
"client.tempsize": {
"lt": 65594
}
}
}
]
}
}
}
},
"rule": {
"ruledesc": "Client should be Athena amp; tempsize should have sufficient space (eg: > 65594) and should not be a string",
"step": 1
}
}
мой документ
GET /eg/message/_percolate
{
"doc": {
"client": {
"name": "Athena",
"tempsize": "IATEMPDIR does not exist"
}
}
}
Приведенный выше документ выдает мне ...MapperParsingException[failed to parse [client.tempsize]]; nested: NumberFormatException...
, но когда я использую "tempsize": 12
, он возвращает правильный результат.
{
"took": 3,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"total": 1,
"matches": [
{
"_index": "eg",
"_id": "1"
}
]
}
Обновить
После просмотра ответа ppearcy. Я изменил отображение на
PUT /eg/message/_mapping
{
"properties": {
"client": {
"properties": {
"name": {
"type": "string"
},
"tempsize": {
"type": "long",
"ignore_malformed" : "true"
}
}
}
}
}
и приведенный ниже документ не приводит к моему запросу и игнорирует строку
GET /eg/message/_percolate
{
"doc": {
"client": {
"name": "Athena",
"tempsize": "IATEMPDIR does not exist"
}
}
}
Итак, если я даю "tempsize": "65594"
, учитывает ли это числа в двойных кавычках (поскольку при указании чисел меньше 65594 возвращается мой запрос)? Или оно где-нибудь сломается?
Ответ №1:
Вы должны установить «ignore_malformed»: «true» в вашем сопоставлении для поля.
Это позволит вам по-прежнему индексировать документы, а нечисловые значения будут просто игнорироваться и могут быть запрошены с отсутствующими / существующими типами запросов.
Используя синтаксис запроса lucene для упрощения, ваш конечный запрос будет выглядеть следующим образом:
_missing_:client.tempsize OR client.tempsize:[0 TO 65594]
Ознакомьтесь с разделом number здесь для получения дополнительной информации:
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html
Комментарии:
1. Означает ли это, что он игнорирует строковое значение и обрабатывает все как целое? Даже «65594» является целым числом?
2. Да, но это зависит от вашего сопоставления полей. Если вы не задаете сопоставление, elasticsearch делает предположения на основе первых данных, которые он видит. Это предполагаемое поведение подходит для взлома, но для большинства случаев использования следует устанавливать явные сопоставления.