Elasti c Поиск Нечеткий Поиск root и вложенные поля - PullRequest
0 голосов
/ 02 марта 2020

Я новичок в 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
            }
        }
    }
}

1 Ответ

0 голосов
/ 02 марта 2020

Нечеткий запрос предназначен для поиска приближений вашего полного запроса на определенном расстоянии:

Чтобы найти похожие термины, нечеткий запрос создает набор из всех возможных вариантов. , или расширения поискового термина в пределах указанного расстояния редактирования. Затем запрос возвращает точные совпадения для каждого расширения.

Если вы не можете разрешить нечеткое сопоставление отдельных терминов в вашем запросе, вам нужно использовать запрос на совпадение с активированной нечеткостью ,

POST <your_index>/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "cityName": {
              "query": "Islamabad golf",
              "fuzziness": "AUTO"
            }
          }
        },
        {
          "nested": {
            "path": "places",
            "query": {
              "match": {
                "places.name": {
                  "query": "Islamabad golf",
                  "fuzziness": "AUTO"
                }
              }
            }
          }
        }
      ]
    }
  }
}

Напоминание: Нечеткость в упругом поиске допускает максимум 2 исправления за семестр. Таким образом, вы никогда не сможете сопоставить Islam с Islamabad, поскольку между этими условиями есть 4 изменения.

Для получения дополнительной информации о параметрах расстояния и нечеткости, пожалуйста, обратитесь к этой странице документации Параметры нечеткости

...