Postgres & ПОЛНЫЙ ТЕКСТ ПОИСК: Какой правильный SQL-запрос для поиска фразы с несколькими отрицательными фразами - PullRequest
0 голосов
/ 03 июля 2019

У меня есть таблица со столбцом description.

В этой таблице я добавил дополнительный столбец с именем tsv, который заполняется вектором описания.

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

Например, взять stream , как в маленькой реке.

Я получаю

WHERE tsv @@ to_tsquery('english', '
        stream
    ')

RETURNS: 26

Нов некоторых описаниях, как я проверил все 26 вручную, они говорят только о:

... свет, идущий из обоих окон ... (есть 1 с этим в)

или

... поток естественного света ... (Есть 2 с этим в)

Что не имеет ничего общего снебольшой поток проточной воды.

Это в общей сложности 3, поэтому я ожидаю, что вместо этого будет возвращено 23.

Вотчто я пробовал до сих пор, ни один из которых не возвращает 23:

WHERE tsv @@ to_tsquery('english', '
        stream
        & ! light<->streaming
        | ! stream<2>natural<->light
    ')

>RETURNS: 261

или

WHERE tsv @@ to_tsquery('english', '
        stream
        & ! light<->streaming
        & ! stream<2>natural<->light
    ')

>RETURNS: 3

или

WHERE tsv @@ to_tsquery('english', '
        stream
        & ! ( 
            light<->streaming
            | stream<2>natural<->light
        )
    ')

>RETURNS: 8

или

WHERE tsv @@ to_tsquery('english', '
        stream
        & ( 
            ! light<->streaming
            | ! stream<2>natural<->light
        )
    ')

>RETURNS: 26

Что я делаю не так?Или есть совершенно другой способ, которым мне нужно это делать?

Заранее спасибо

ДОПОЛНЕНИЕ

Просто так я знаю наверняка и длямой здравый смысл, я звонил этот код для каждого термина, который я пытаюсь отрицать

WHERE tsv @@ to_tsquery('english',
        'light<->streaming'
     )

>RETURNS: 1
WHERE tsv @@ to_tsquery('english',
        'stream<2>natural<->light'
     )

>RETURNS: 2

Оба вернули записи, которые я хочу удалить из основного запроса.

1 Ответ

0 голосов
/ 03 июля 2019

Оператор отрицания ! связывает сильнее, чем <->, поэтому вам придется правильно использовать круглые скобки:

... WHERE tsv @@ to_tsquery(
                    'english',
                    'stream
                     & !(light <-> stream)
                     & !(stream <2> natural <-> light)'
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...