Может кто-нибудь объяснить мне, какие запросы мне нужны для хорошего поиска в SQL? - PullRequest
3 голосов
/ 11 ноября 2011

Я запросил один запрос в моем предыдущем вопросе , но теперь я хочу задать несколько запросов.

Я создаю поисковую систему, которая просматривает некоторые конкретные таблицы.

Когда вводится « testone testtwo testthree », мне нужно будет выполнить много запросов.

  1. поиск с полной строкой
  2. поиск с 3 словами в 3 строках (если их можно найти отдельно в одном элементе)
  3. поиск с двумя словами в объединенной строке
  4. поиск с 2 словами в 2 строках
  5. поиск со всеми словами, кроме

Как вы знаете, это решает, что является более важным результатом.

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

Я сделал такие запросы:

SELECT *
FROM company_address
WHERE address_street LIKE '%test%'
OR address_zipcode LIKE '%test%'
OR address_telephone LIKE '%test%'"
OR address_fax LIKE '%test%'
OR address_website LIKE '%test%'

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

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Даже если бы вы могли сделать все это в одном запросе, было бы трудно, если это возможно, определить, какой результат более важен (уместен) в этом случае ... поэтому вы либо делаете запросы отдельно, либо выполняете некоторые полностьюдругое решение.Похоже, вы могли бы использовать что-то вроде поискового сервера Sphinx (он используется в сочетании с вашей RDBMS, MySQL наиболее вероятно), это с открытым исходным кодом:

http://sphinxsearch.com/

Sphinx может искать фразы и сортироватьрезультаты по релевантности.

1 голос
/ 11 ноября 2011

В прошлом я делал некоторые хитрости, используя CASE.

SELECT
    *,
    CASE WHEN address_street LIKE '%test%' THEN 1 ELSE 0 END
    +
    CASE WHEN address_zipcode LIKE '%test%' THEN 1 ELSE 0 END
    +
    CASE WHEN address_telephone LIKE '%test%' THEN 1 ELSE 0 END
    +
    CASE WHEN address_fax LIKE '%test%' THEN 1 ELSE 0 END
    +
    CASE WHEN address_website LIKE '%test%' THEN 1 ELSE 0 END
    AS Score
FROM company_address

Это дает вам результаты с оценкой, где чем больше матчей, тем выше оценка, и вы можете выставлять разные оценки разным матчам. Если вы повторите оператор CASE в ORDER BY или WHERE, вы можете сузить результаты.

Это может быть довольно громоздким, но будьте осторожны:)

...