Ubuntu 16.04
Эластичная поисковая версия 6.4.0
У меня есть документ со следующей структурой:
{
"items": {
"mappings": {
"item": {
"properties": {
"name": {
"type": "text",
"boost": 1.6
},
"color": {
"type": "text",
"boost": 1.4
},
"year": {
"type": "text",
"boost": 1.5
},
"condition": {
"type": "text",
"boost": 1.6
},
"description": {
"type": "text",
"boost": 1.1
},
"suggest": {
"type": "completion",
"analyzer": "standard",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50,
"contexts": [
{
"name": "name",
"type": "category",
"path": "name"
},
{
"name": "color",
"type": "category",
"path": "color"
},
{
"name": "year",
"type": "category",
"path": "year"
}
]
}
}
}
}
}
}
Как запросить у сервера ES предложение всей фразы, НО, учитывая
каждое слово в поисковой фразе?
Например, если я ищу «bike re», я должен получить предложения, такие как «red 2014» и / или «red 2016» - если он, конечно, существует.
Вот что я придумал (пример запроса _search). Или, по крайней мере, как я себе это представлял. Допустим, я набираю "велосипед ре". Итак, на бэкенде я бы разбил все строки на строчные и строчные буквы и искал что-то вроде:
{
"suggest": {
"suggest": {
"prefix": "bike re",
"completion": {
"field": "suggest",
"skip_duplicates": true,
"size": 15,
"contexts": {
"name": [
"bike",
"re"
],
"year": [
"bike",
"re"
]
}
}
}
}
}
Но, конечно, это ничего не вернет, так как контексты не совпадают, и нет предлагаемого термина "бай-ре",
А также это означает, что мне нужно создать большое количество контекстов (и предложить исходные данные) для каждого элемента, и они
должны быть точными словами. Есть ли другой способ?
Может ли это быть лучше при нечетком поиске?