У меня есть таблица, в которой есть terms
, эти термины фактически являются возможными поисковыми входами, добавленными пользователями, выглядит примерно так:
| id | name | remote_id | type |
| --- | ------------- | ---------- | ---------- |
| 1 | Audi | 3453 | category |
| 2 | Audi RS | 52434 | model |
| 3 | Las Vegas | 30 | city |
| 4 | 1994 | 10 | production |
| 5 | Audi for sale | 3454 | category |
| 6 | Audi for rent | 3455 | category |
Я хочу создать простой метод, позволяющий пользователю получить хороший результат поиска для этого вида ввода:
Audi for sale 1994 in Las Vegas
Я хочу получить минимальный результат из таблицы, которая соответствует входным предложениям, мой требуемый результат:
1- Audi for sale
2- 1994
3- Las Vegas
Но я не смог получить этот результат, поскольку то, что я пробовал, использует:
"SELECT DISTINCT * FROM `terms` WHERE MATCH (name) AGAINST ('Audi for sale 1994 in Las Vegas' IN BOOLEAN MODE)"
Но потом я получил результаты, которые мне не нужны, например Audi, Audi RS, Audi for rent
.
В соответствии с тем, что я прочитал здесь , я попытался разбить входное предложение следующим образом и, добавив +
перед каждым словом, затем выполнить поиск, пытаясь найти их все:
+Audi
+Audi +for
+Audi +for +sale
+Audi +for +sale +1994
+Audi +for +sale +1994 +in
+Audi +for +sale +1994 +in +Las
+Audi +for +sale +1994 +in +Las +Vegas
Я попытался, чтобы гарантировать порядок слов, совпадающий с записями в моей таблице:
SELECT DISTINCT * FROM `terms` WHERE MATCH (name) AGAINST ('(+Audi) (+Audi +for) (+Audi +for +sale) (+Audi +for +sale +1994) .....' IN BOOLEAN MODE)
Но тогда это также привело к потере некоторых ожидаемых результатов, таких как 1994
и Las Vegas
.
Я надеюсь, что смогу объяснить, чего я пытаюсь достичь, спасибо.
EDIT
Позвольте мне быть более ясным и добавить некоторые подробности, суть в том, чтобы пользователи не использовали FILTERS на моем веб-сайте для поиска автомобилей, например, вместо того, чтобы выбрать Audi, затем выбрать «RS», затем выбрать «Las Vegas» и год выпуска "1994", я хочу, чтобы пользователь мог искать Audi for sale 1994 in Las Vegas
в одном текстовом поле, и необходимо выполнить фильтрацию в бэкэнде, чтобы отделить и классифицировать правильные категории и параметры для использования в процессе поиска .
Если бы я мог определить, что «Audi for sale» - это category
, «1994» - это production
, а «Лас-Вегас» - это city
, тогда я могу просто создать запрос, который может получить правильный результат для пользователя без него, чтобы отфильтровать вручную.