Вопрос

Здравствуйте: Я хочу сделать «взвешенный поиск» на продукте, который помечен ключевыми словами. (Итак: не полное поиск, а N-M-M-MERETATION). Итак, вот это:

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   /

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

Dog Citrys составляет 1,003, слон 1,002 мауса 1,001

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

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

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

Может быть, внутри сумма () и, вероятно, с группой в конце соединения над перекрестным столом, а? Но я совершенно не знаю, как справиться с этим.

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

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

Данчшён, если вы можете помочь мне в этом :-)

Это было полезно?

Решение

Я думаю, что многое из этого в двигателе Lucene (http://lucene.apache.org/java/docs/index.html), которая доступна для PHP в рамках Zend: 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 пункт.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top