我目前正在为搜索功能开发索引器。索引器将处理来自“字段”的数据。 字段看起来像:
Field_id Field_type Field_name Field_Data
- 101 text Name Intel i7
- 102 integer Cores 4 physical, 4 virtual
- 103 select Vendor Intel
- 104 multitext Description The i7 is intel's next gen range of cpus.
索引器将生成以下结果/索引:
Keyword Occurrences
- intel 101, 103, 104
- i7 101, 104
- physical 102
- virtual 102
- next 104
- gen 104
- range 104
- cpus 104 (*)
- cpu 104 (*)
所以它看起来有点不错,但是,有一些问题我想解决:
- 过滤掉常用词(您可能已经注意到,列表中缺少“the”、“is”、“of”和“intel's”)
- 关于“cpus”(复数与单数),最好是同时使用特定类型(单数或复数)还是完全使用(即“cpus”与“cpu”不同)?
- 继续上一项,我如何确定复数(不同的口味:test=>tests fish=>fish and leaf=>leaves)
- 我目前正在使用 MySql,我非常担心性能问题;我们有 500 多个类别,我们甚至没有启动网站
- 假设我想使用搜索词“vendor:intel”,其中 vendor 指定字段名称 (field_name),您认为这会对 sql server 产生巨大影响吗?
- 搜索限制;我一点也不喜欢这样,但这是有可能的,如果您知道任何变通办法,请说出来!
- 还有其他问题我可能忘记了,如果您发现任何问题,欢迎您对我大喊大叫 ;-)
- 我不需要搜索引擎抓取链接,事实上,我特别希望它不抓取链接。
(顺便说一下,我对英特尔没有偏见,我只是碰巧拥有一台基于 i7 的电脑 ;-))
最佳答案
从这里获取停用词(非关键字)列表,这家伙甚至为您在 php 中格式化了它们。 http://armandbrahaj.blog.al/2009/04/14/list-of-english-stop-words/
然后只需对要索引的字符串执行 preg_replace。
我过去所做的是使用正则表达式删除“s”、“ed”等后缀,并在搜索字符串上使用相同的正则表达式。虽然这并不理想。这是一个只有 200 页的基本网站。
如果您担心性能,您可能需要考虑使用 Lucine (solr) 等搜索引擎而不是数据库。这将使索引更容易。您不想在这里重新发明轮子。
关于PHP 单词索引,性能和合理的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3315910/