Представьте, что у меня есть индекс со следующими тремя документами, представляющими изображения и их цвета.
[
{
"id": 1,
"intensity": {
"red": 0.6,
"green": 0.1,
"blue": 0.3
}
},
{
"id": 2,
"intensity": {
"red": 0.5,
"green": 0.6,
"blue": 0.0
}
},
{
"id": 3,
"intensity": {
"red": 0.98,
"green": 0.0,
"blue": 0.0
}
}
]
Если пользователь хочет «красное изображение» (выбранное в раскрывающемся списке или в «облаке тегов»), очень удобно выполнять запрос диапазона по плавающим значениям (возможно, intensity.red > 0.5
). Я также могу использовать оценку этого запроса, чтобы получить «самое красное» изображение, получившее самый высокий рейтинг.
Однако, если я хотел бы предложить поиск в свободном тексте, это становится сложнее. Мое решение заключается в том, чтобы индексировать документы следующим образом (например, использовать if color > 0.5 then append(colors, color_name)
во время индексации):
[
{
"id": 1,
"colors": ["red"]
},
{
"id": 2,
"colors": ["green", "red"]
}
{
"id": 3,
"colors": ["red"]
}
]
Теперь я могу использовать query_string
или match
в поле цветов и затем искать "red"
, но внезапно я потерял свои возможности ранжирования. ID 3 намного более красный, чем ID 1 (0.98
против 0.6
), но результат будет аналогичным?
Мой вопрос: могу ли я взять торт и съесть его тоже?
Одно решение, которое я вижу, состоит в том, чтобы иметь один индекс, который превращает свободный текст в «ключевые слова», которые я позже использую в реальном поиске.
POST image_tag_index/_search {query: "redish"} -> [ "red" ]
POST images/_search {query: {"red" > 0.5}} -> [ {id: 1}, {id: 3}]
Но тогда мне нужно запустить два поиска для каждого поиска, но, может быть, это единственный вариант?