Сфинкс - Как получить точное совпадение, то есть то же самое, что и mysql WHERE column = "value" - PullRequest
0 голосов
/ 03 марта 2020

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

Я использую следующий запрос:

SELECT id, first_name,last_name,email_personal, phone_number, WEIGHT() as relevance FROM people WHERE MATCH('@(phone_number,email_personal) "^+447111$" "^myemail@gmail\.com$ "');

Возвращает строки, содержащие полный номер телефона (т.е. +44711122334), насколько я понимаю, не должен значит, он должен пытаться сопоставить «^ + 447111 $» в качестве начала и конца поля?

Я также пробовал этот тестовый запрос, и у меня возникла та же проблема, за исключением того факта, что возвращает намного больше совпадений, так как он будет соответствовать любому значению поля, содержащему критерии, а не всему значению поля. Значения не являются полными значениями, которые я ищу, но это тест, поскольку он должен соответствовать строкам, которые имеют только номер телефона "+447711" и адрес электронной почты "@ gmail.com", которые не существует в базе данных, но она возвращает строки, где номер телефона начинается с +447711, а в электронном письме содержится @ gmail.com.

SELECT id, first_name,last_name,email_personal,phone_number, WEIGHT() as relevance FROM people WHERE MATCH('@phone_number "^+447711$" @email_personal "^@gmail\.co$"') ORDER BY relevance DESC;

Просто для подтверждения я пытаюсь найти совпадения где значения полей соответствуют точному тексту, то есть это будет запрос SQL (и да, это тоже не работает!)

SELECT id,first_name,last_name,email_personal,phone_number FROM people WHERE phone_number = '+44711122334' AND email_personal = 'myemail@gmail.com';

Config:

index people
{
                type = rt
                path = /var/local/sphinx/indexes/ppl/

                rt_field = first_name
                rt_field = last_name
                rt_field = phone_number
                rt_field = email_personal
                stored_fields = first_name,last_name,phone_number,email_personal
                rt_mem_limit = 512M

                expand_keywords = 1
                min_prefix_len = 2
                min_word_len = 2
                index_exact_words = 1
}

1 Ответ

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

бах! Это всегда так. Вы тратите часы, пытаясь выяснить это, публикуя его в StackOverflow, а затем в течение нескольких мгновений на вас выскакивает ответ.

Оказывается, это был параметр 'expand_keywords' в конфигурации, который был ответственным. Для тех, кто не знает, это то, что он делает ...

Запросы к индексам с включенной функцией expand_keywords внутренне расширяются следующим образом. Если индекс был построен с включенной индексацией префикса или инфикса, каждое ключевое слово внутренне заменяется дизъюнкцией самого ключевого слова и соответствующего префикса или инфикса (ключевое слово со звездами). Если индекс был создан с использованием обоих параметров: stemming и index_exact_words, точная форма также добавляется. Вот пример, который показывает, как работает внутреннее расширение, когда объединяются все вышеперечисленные (инфиксы, основы и точные слова):

выполняется -> (выполняется | * выполняется * | = выполняется)

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

Удаление этой строки из конфигурации и перезапуск Sphinx решил проблему сразу, вам даже не нужно переиндексировать, что хорошо.

Я решил оставить вопрос и ответить здесь, если у кого-то еще есть подобная "проблема" ;)

...