SQL-запрос текстового соответствия, который находит похожие соответствия на основе темы, но ограничивает точное соответствие - PullRequest
0 голосов
/ 12 декабря 2018

Я создаю инструмент отслеживания ошибок и пытаюсь добавить возможность поиска похожих ошибок, исключая ошибку, по которой вы ищете.Я использую Laravel 5.7 / eloquent и postgreSQL.Текущий необработанный запрос выглядит следующим образом:

SELECT 
    * 
FROM bugs 
WHERE 
    subject::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
OR 
    description::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.'
AND 
    id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5'

Красноречивая версия извлекается в класс BugSearch, но по существу делает это:

$builder = DB::table('bugs');
$builder->where('subject', 'like', $bug->subject)
        ->orWhere('description', 'like', $bug->description);

И возвращает построитель, после чего я пытаюсьдобавить к предложению where:

$matches = $builder->where('id', '!=', $bug->id)->get();
return response()->json($matches);

Это явно не работает как необработанный запрос или с построителем запросов eloquent, поскольку оба возвращают точные совпадения, которые должны быть отфильтрованы предложением where.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я действительно решил эту проблему, передав ->where('id', '!=', $bug->id); в конструктор класса BugSearch.

0 голосов
/ 12 декабря 2018

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

Однако, исходя из вашего поста, вы можете просто столкнуться с проблемой приоритет оператора .and имеет наивысший приоритет, чем or, поэтому вы, вероятно, хотите заключить свои or в парены.

Кроме того, если вы хотите использовать оператор LIKE, вам необходимо окружитьстрока поиска со знаком процента (%).

select * from bugs 
where 
( 
    subject::text like '%Delectus iusto est architecto magni expedita eum rerum consequatur.%' 
    or description::text like '%Delectus iusto est architecto magni expedita eum rerum consequatur.%' 
)
and id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5' 

Без паренов запрос фактически эквивалентен:

select * from bugs 
where 
subject::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
or 
( 
    or description::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
    and id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5' 
)
order by created_at desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...