Взвешенный поиск по ключевым словам - PullRequest
1 голос
/ 18 января 2011

Здравствуйте. Я хочу выполнить "взвешенный поиск" по продукту, который помечен ключевыми словами. (Итак: не полнотекстовый поиск, а отношение n-to-m). Итак, вот оно:

Table 'product':
sku  - the primary key
name

Table 'keywords':
kid   - keyword idea
keyword_de  - German language String   (e.g. 'Hund','Katze','Maus')
keyword_en  - English language String  (e.g. 'Dog','Cat','Mouse')

Table 'product_keyword' (the cross-table)
sku   \__ combined primary key
kid   /

Я хочу получить оценку по всем продуктам, которые хотя бы "содержат" одно релевантное ключевое слово. Если я ищу («Собака», «Слон», «Маус»), я хочу, чтобы

Собака начисляет 1,003 балла, Слон 1.002 Маус 1.001

Поэтому наименее важный поисковый термин начинается с 1,001, а все остальное - 0,001 ++. Таким образом, нижний предел оценки 3,0 будет равен запросу «И» (должны быть найдены все три ключевых слова), а нижний предел оценки 1,0 будет равен «ИЛИ». Что-нибудь между чем-то более или менее подходящим. В частности, сортируя по этой оценке, наиболее релевантные результаты поиска будут первыми (независимо от нижнего предела) ...

Думаю, мне придется что-то делать с

  IF( keyword1 == 'dog', 1.001, 0) + IF...

может быть внутри SUM () и, возможно, с GROUP BY в конце JOIN через кросс-таблицу, а? Но я совершенно не знаю, как с этим справиться.

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

У меня есть PHP под рукой, чтобы автоматически подготовить довольно длинную инструкцию PHP, но я хотел бы избежать дальнейших множественных операторов SQL. В частности, поскольку я ограничу результат запроса (чаще всего «LIMIT 0, 20») для результатов режима подкачки, поэтому зацикливание очень большого числа промежуточных результатов через сценарий было бы бесполезным ...

DANKESCHÖN, если вы можете помочь мне в этом: -)

1 Ответ

2 голосов
/ 18 января 2011

Я думаю, что многое из этого в движке Lucene (http://lucene.apache.org/java/docs/index.html),, который доступен для PHP в Zend Framework: http://framework.zend.com/manual/en/zend.search.lucene.html.

РЕДАКТИРОВАТЬ:

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

select p.sku, sum(case k.keyword_en when 'Dog' then 1001 when 'Cat' then 1002 when 'Mouse' then 1003 else 0 end) as totalscore
from products p
left join product_keyword pk on p.sku = pk.sku
inner join keywords k on k.kid = pk.kid
where k.keyword_en in ('Dog', 'Cat', 'Mouse')
group by p.sku

(Правка 2: забыл предложение group by.)

...