Лучший способ фильтрации (поисковая система) в запросе - PullRequest
0 голосов
/ 31 марта 2020

В настоящее время у меня есть таблица (car_brands) списка марок автомобилей (Honda, Toyota, BMW, Mercedes Benz и др. c ..), и у меня есть заголовок, который пользователь будет вводить, например, mercedes benz e 230, поэтому Я хотел бы получить информацию, которую пользователь может найти, чтобы получить марку из таблицы car_brands. Какой лучший способ для меня это сделать и как я могу оптимизировать его, чтобы он работал быстрее и получал лучший результат.

Текущий код:

$user_input = 'mercedes benz e 230';
CarBrand::where('name', 'ilike', '%' . $user_input . '%')->first();

enter image description here

и т. Д. Для результата таблицы ..

1 Ответ

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

Вы можете просто определить, car_brand в качестве ключевого слова и выполнить поиск после фильтрации по полю car_brand, это будет:

  1. Сократить количество документов для поиска только в указанном бренде c в соответствии с вашим требованием и меньшее количество документов для поиска означает более быстрый поиск.
  2. Фильтры кэшируются в Elasticsearch, поэтому в следующий раз, когда вы отфильтруете тот же термин, например, mercedes, он получит из кэша, что Быть достаточно быстрым по сравнению с повторной фильтрацией данных.

Определение индекса

{
    "mappings": {
        "properties": {
            "brand": {
                "type": "keyword" --> note
            },
            "title": {
                "type": "text"
            }
        }
    }
}

Пример индекса выполнения c

{
    "title" : "mercedes benz e 330",
    "brand" : "mercedes"
}

{
    "title" : "fortuner",
    "brand" : "toyota"
}

Поисковый запрос

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "title": "mercedes benz e 330"
                    }
                }
            ],
            "filter": [
                {
                    "term": {
                        "brand": "Mercedes" --> filter `Mercedes` brand and then do search
                    }
                }
            ]
        }
    }
}

Результат

 "hits": [
            {
                "_index": "so_query_car",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.2401118,
                "_source": {
                    "title": "mercedes benz e 330",
                    "brand": "mercedes"
                }
            }
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...