Как искать весь текст без разделения по пробелу в полнотекстовом поиске - PullRequest
1 голос
/ 25 апреля 2020

У меня есть запрос для полнотекстового поиска

select title from products where MATCH (title) AGAINST ('green book') 

, но этот запрос возвращает эти продукты

+-------------+------------------+
|      id     |      title       |
----------------------------------
|      34     |    green book    |
----------------------------------
|      84     |    green shirt   |
----------------------------------
|      22     |    red book      |
----------------------------------

Я использую операцию Like%, которая возвращает правильные данные, но мне нужен ранг способность и лучшую производительность, потому что длина этого столбца превышает 2000.

Мой ожидаемый результат:

+-------------+------------------+
|      id     |      title       |
----------------------------------
|      34     |    green book    |
----------------------------------

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Есть две возможности, как это сделать два раза

CREATE TABLE products (
  `id` INTEGER,
  `title` VARCHAR(11)
, 
FULLTEXT(title));

INSERT INTO products
  (`id`, `title`)
VALUES
  ('34', 'green book'),
    ('35', 'book green'),
  ('84', 'green shirt'),
  ('22', 'red book');
✓

✓
SELECT * FROM products WHERE match(title) against('+green +book' IN BOOLEAN MODE) 
AND title like '%green book%'
id | title     
-: | :---------
34 | green book
  SELECT * FROM products WHERE match(title) against('"green book"' IN BOOLEAN MODE) 
id | title     
-: | :---------
34 | green book

дБ <> скрипка здесь

1 голос
/ 25 апреля 2020

Во-первых, вам повезло, что ни один из ваших поисковых терминов не является стоп-словом или слишком коротким.

Во-вторых, вам нужно пересмотреть, как использовать match(). Любое совпадение в тексте будет возвращать значение больше 0 - в вашем случае одно или оба слова. Наличие нескольких копий слова может увеличить оценку.

Вы можете изменить слова, используемые для поиска, используя + - это требует их наличия. И это то, на что Луук указал в комментарии, за исключением того, что вам нужен логический режим:

where MATCH (title) AGAINST ('+green +book' in boolean mode)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...