Я новичок в Elasti c Поиск и столкновение с парой проблем при запросах. У меня есть простая база данных Mongodb с коллекциями городов и достопримечательностей. Каждая коллекция имеет cityName и другие подробности, такие как веб-сайт et c, а также массив объектов place. Это мое отображение;
{
"mappings": {
"properties": {
"cityName": {
"type": "text"
},
"phone": {
"type": "keyword"
},
"email": {
"type": "keyword"
},
"website": {
"type": "keyword"
},
"notes": {
"type": "keyword"
},
"status": {
"type": "keyword"
},
"places": {
"type": "nested",
"properties": {
"name": {
"type": "text"
},
"status": {
"type": "keyword"
},
"category": {
"type": "keyword"
},
"reviews": {
"properties": {
"rating": {
"type": "long"
},
"comment": {
"type": "keyword"
},
"user": {
"type": "nested"
}
}
}
}
}
}
}
}
Мне нужен нечеткий запрос, в котором пользователь может искать и cityName, и place.name, однако я получаю результаты при поиске по одному слову, добавляя несколько слов, возвращая 0 совпадений. Я уверен, что чего-то здесь не хватает, потому что я начал изучать elasti c search 2 days a go. Следующий запрос возвращает результаты, потому что у меня есть документ с массивом cityName: Islamabad
и places
, в котором есть объекты с ключевым словом Исламабад в их name
, в некоторых places
ключевое слово Исламабад находится в начале place.name
, а в некоторых places
объектах это может быть в середине или в конце
Это то, что я использую: Возвращает результаты, когда только один слово
{
"query": {
"bool": {
"should": [
{
"fuzzy": {
"cityName": "Islamabad"
}
},
{
"nested": {
"path": "places",
"query": {
"fuzzy": {
"places.name": "Islamabad"
}
}
}
}
]
}
}
}
Добавление еще одного слова, скажем, club
, к вышеуказанному запросу возвращает 0 совпадений, когда у меня действительно есть места с именами Islamabad club
и Islamabad Golf club
Проблема Поисковый запрос отправляется из приложения, поэтому он является динамическим c, поэтому термин для поиска одинаков как для cityName
, так и places.name
И places.name
не всегда содержит cityName
.
Что мне нужно именно ?? Мне нужен запрос, по которому я могу искать cityName и массив мест (только поиск мест.имя). Запрос должен быть нечеткого типа, чтобы он по-прежнему возвращал результаты, если слово Islamabad
написано как Islambad
, или даже возвращает результаты для Islam
или Abad
. И запрос должен также возвращать результаты для нескольких слов, я уверен, что я делаю что-то не так. Буду признателен за любую помощь.
** PS: ** Я на самом деле использую MongoDB в качестве базы данных, но перехожу на Elasti c Ищите ТОЛЬКО для улучшения нашей функции поиска. Я пробовал разные способы с MongoDB, использовал модуль mongoose-fuzzy-searching
npm, но это не сработало, поэтому, если есть более простое решение для MongoDB, поделитесь им тоже.
Спасибо.
РЕДАКТИРОВАТЬ 1:
Мне пришлось изменить структуру (отображение) моих данных. Теперь у меня есть 2 отдельных индекса, один для городов с подробной информацией о городе и cityId
, а другой индекс для всех мест, у каждого места есть cityId
, который будет использоваться для присоединения позже при необходимости. В каждом месте также есть клавиша cityName
, поэтому я буду искать только в индексе мест, потому что он содержит все данные (название места и название города).
У меня есть город, включающий в себя слово Welder's
. name, а также в некоторых местах внутри одного и того же места есть слово Welder's
в названии, которое имеет type:text
. Однако при поиске welder
оба следующих запроса не возвращают эти документы, поиск по welders
ИЛИ welder's
возвращает эти документы. Я не уверен, почему welder
не будет совпадать с Welder's*
. Я не указывал никакой анализатор при создании обоих индексов, и при этом я не определяю его явно в запросе, может ли кто-нибудь помочь мне с этим запросом, чтобы он вел себя как ожидалось:
Запрос 1:
{
"query": {
"bool": {
"should": [
{
"match": {
"name": {
"query": "welder",
"fuzziness": 20
}
}
},
{
"match": {
"cityName": {
"query": "welder",
"fuzziness": 20
}
}
}
]
}
}
}
Запрос 2:
{
"query": {
"match": {
"name": {
"query": "welder",
"fuzziness": 20
}
}
}
}