我已经实现ZendSearch了我的Laravel应用程序.我使用它作为我的搜索引擎,用户将在其中键入搜索词,然后ZendSearch将返回一系列按相关性排序的结果.但是,ZendSearch返回的数组只返回我的记录ID(它不返回任何实际的记录信息).
下一步是什么是查询我的模型以基于ZendSearch数组结果检索结果的正确方法,该数组结果只是基于相关性排序的ID数组.
我知道Model::find(1)哪个会以ID为1返回我的记录,但是如何将该find()方法提供给我想要按照我给它的顺序返回的ID数组.
Google在解析网络时如何找到相关内容?
比如说,谷歌使用PHP原生DOM库来解析内容.他们有什么方法可以在网页上找到最相关的内容?
我的想法是它将搜索所有段落,按每个段落的长度排序,然后从可能的搜索字符串和查询参数中找出每个段落的相关百分比.
假设我们有这个网址:
http://domain.tld/posts/stackoverflow-dominates-the-world-wide-web.html
Run Code Online (Sandbox Code Playgroud)
现在从该URL我会发现HTML文件名具有高度相关性,所以我会看到该字符串与页面中所有段落的比较接近!
当您共享页面时,一个非常好的例子就是Facebook共享.Facebook快速创建链接并带回图像,内容等.
我认为某种计算方法最好,根据周围元素和元数据计算出相关性的百分比.
是否有关于内容解析的最佳实践的书籍/信息,包括如何从网站获取最佳内容,任何可能被讨论的算法或任何深入的回复?
我想到的一些想法是:
div容器的宽度和高度,并按(W + H) - @Benoit排序我之所以需要这些信息:
我正在建立一个网站,网站管理员向我们发送链接,然后我们列出他们的网页,但我希望网站管理员提交一个链接,然后我去抓取该网页,找到以下信息.
希望你们能够理解这不适用于搜索引擎,但搜索引擎处理内容发现的方式与我需要的内容相同.
我不是要求商业机密,我问你的个人方法是什么.
假设我有两列,关键字和内容.我有两个全文索引.我希望关键字中的foo行与内容中的foo行具有更多相关性.我需要做些什么才能使MySQL对关键字中的匹配项进行加权?
我正在使用"匹配"语法.
解:
能够以下列方式完成这项工作:
SELECT *,
CASE when Keywords like '%watermelon%' then 1 else 0 END as keywordmatch,
CASE when Content like '%watermelon%' then 1 else 0 END as contentmatch,
MATCH (Title, Keywords, Content) AGAINST ('watermelon') AS relevance
FROM about_data
WHERE MATCH(Title, Keywords, Content) AGAINST ('watermelon' IN BOOLEAN MODE)
HAVING relevance > 0
ORDER by keywordmatch desc, contentmatch desc, relevance desc
Run Code Online (Sandbox Code Playgroud) 我在INNODB表中有大约20,000行称为'cards',所以FULLTEXT不是一个选项.
请考虑此表:
id | name | description
----------------------------------------------------------
1 John Smith Just some dude
2 Ted Johnson Another dude
3 Johnathan Todd This guy too
4 Susan Smith Her too
5 Sam John Bond And him
6 John Smith Same guy as num 1, another record
7 John Adams Last guy, promise
Run Code Online (Sandbox Code Playgroud)
因此,假设用户搜索"John",我希望结果集的顺序为:
7 John Adams
6 John Smith
3 Johnathan Todd
5 Sam John Bond
2 Ted Johnson
Run Code Online (Sandbox Code Playgroud)
请注意,我们只拉了一次'John Smith',我们最近参加了他的录取.由于我的数据,所有名字都是针对同一个人,不需要担心两个名叫John Smith的人.想法?如果我能澄清任何事情,请告诉我.
我需要对2+个因子进行加权排序,按"相关性"排序.然而,这些因素并非完全孤立,因为我希望一个或多个因素影响其他因素的"紧迫性"(权重).
示例:贡献的内容(文章)可以上/下投票,因此具有评级; 他们有一个发布日期,他们也被标记为类别.用户撰写文章并可以投票,并且可能有也可能没有自己的某种排名(专家等).可能与StackOverflow类似,对吧?
我想为每个用户提供按标签分组但按"相关性"排序的文章列表,其中相关性是根据文章的评级和年龄计算的,并且可能受作者排名的影响.IE是几年前写的一篇排名很高的文章可能不一定像昨天写的中等文章一样重要.也许如果一篇文章是由专家撰写的,那么它将被视为比"Joe Schmoe"所写的文章更具相关性.
另一个很好的例子是为酒店分配一个由价格,评级和景点组成的"元评分".
我的问题是,多因素排序的最佳算法是什么?这可能是该问题的重复,但我对任意数量因素的通用算法感兴趣(更合理的期望是2 - 4个因素),最好是我不需要的"全自动"功能调整或要求用户输入,我无法解析线性代数和特征向量古怪.
到目前为止我找到的可能性:
注意:S是"排序分数"
在知识库中开发文章数据库时(例如) - 对用户问题进行排序和显示最相关答案的最佳方法是什么?
您是否会根据先前用户是否找到帮助文章,或者您是否找到一个简单的关键字匹配算法来使用其他数据(如关键字加权)?
我正在制作一个测验系统,当测验员向问题库插入问题时,我要检查数据库是否存在重复/非常相似的问题.
测试MySQL的MATCH()... AGAINST(),当我测试100%相似的字符串时,我获得的最高相关性是30+.
那么相关性究竟是什么呢?引用手册:
相关性值是非负浮点数.零相关意味着没有相似性.相关性是根据行中的单词数,该行中唯一单词的数量,集合中的单词总数以及包含特定单词的文档(行)数计算的.
我的问题是如果字符串是重复的,如何测试相关性值.如果它是100%重复,则阻止它插入问题库.但如果它只是如此相似,则提示测验者验证,插入或不插入.那我该怎么做?30%的100%相同的字符串不是百分比,所以我是残局.
提前致谢.
我的任务是创建一个网站范围的搜索功能.搜索需要查看文章,事件和页面内容
我之前在MySQL中使用过MATCH()/ AGAINST()并且知道如何获得结果的相关性,但据我所知,相关性对于搜索(内容,行数等)来说是唯一的.文章表格与事件表格中的结果的相关性不匹配.
无论如何要统一相关性,以便所有三个表的结果具有可比性?
在开发搜索我正在构建的站点时,我决定采用廉价而快捷的方式使用Microsoft Sql Server的全文搜索引擎,而不是像Lucene.Net那样更强大的东西.
不过,我希望拥有的功能之一是google-esque相关文档片段.我很快发现确定"相关"片段比我意识到的更难.
我想根据找到的文本中的搜索词密度选择片段.所以,基本上,我需要在文本中找到最密集的搜索词.通道是一些任意数量的字符(比如200 - 但它确实无关紧要).
我的第一个想法是在循环中使用.IndexOf()并构建一个术语距离数组(从先前找到的术语中减去找到的术语的索引),然后......什么?将任意两个,任意三个,任意四个,任意五个顺序数组元素相加,并使用具有最小和的那个(因此,搜索项之间的最小距离).
这看起来很混乱.
有没有一种既定的,更好的,更明显的方式来做到这一点,而不是我想出来的?
考虑我有一个
string1 = "hello hi goodmorning evening [...]"
Run Code Online (Sandbox Code Playgroud)
我有一些小关键字
compare1 = "hello evening"
compare2 = "hello hi"
Run Code Online (Sandbox Code Playgroud)
我需要一个函数来返回文本和关键字之间的关联.例:
function(string1,compare1); // returns: 4
function(string1,compare2); // returns: 5 (more relevant)
Run Code Online (Sandbox Code Playgroud)
请注意,5和4仅作为示例.
你可以说 - 编写一个计算出现次数的函数 - 但是对于这个例子,这不起作用,因为它们都有2次出现,但是compare1的相关性较低,因为"你好晚上"并不是在string1中找到的(2个字你好和晚上是你好比你好更多)
有没有任何已知的算法来做到这一点?
ADD1:
在这种情况下,像编辑距离这样的算法是行不通的.因为string1是一个完整的文本(如300-400个单词),并且比较字符串最多为4-5个单词.