搜索技术建议

时间:2010-10-29 08:53:52

标签: search lucene full-text-search search-engine sphinx

这更像是一个理论问题,而不是实践。我正在开发一个项目,这是一个非常简单的链接目录。整个模型类似于Dmoz或Yahoo目录,除了每个条目都有一些额外的属性。

我有层次分类法处理所有具有多对多关系的条目,所有条目现在都分类到这些类别中,一切似乎都正常。现在,如果没有搜索选项,目录有什么用?

以下是关于我的模型的更多细节:每个条目都有标题,描述,URL和一些社交个人资料:YouTube,Twitter,Flickr和其他几个。每个条目都可以附加一个徽标,以及一个隐藏的标记字段。此外,标题和描述以三种不同的语言存储。所以基本上我希望搜索结果是:

  1. 相关(包括分类)
  2. 可能是带徽标的
  3. 可能是100%填写个人资料的人
  4. 我已经尝试过Sphinx并且目前正在与Lucene合作,但似乎我在理论上没有得到正确的搜索。我希望填充的条目看起来应该高于其他条目,但我无法弄清楚得分。如果整个描述中只有一个单词匹配,我不希望不相关的条目出现在顶部,因为标题更相关。

    所以我的问题是 - 是否有任何书籍,技术或其他搜索引擎(如果Sphinx和Lucene不够好)你会推荐这个问题 ?我不仅希望完全控制搜索结果及其排名,还能为访问者提供正确且相关的信息。

    很酷的文章链接也很受欢迎!

    ,我不是要重建Google:)

    谢谢:)

4 个答案:

答案 0 :(得分:5)

优秀的书:Lucene in Action (2nd edition)

当我们开始使用Lucene时,我们有了第一版,它会让您逐步完成所需的一切。强烈推荐。第2版​​更新为最新版本(3.x.x)。

Tf-Idf算法在(较大的)文本上运行得非常好,但是如果你有类似记录的结构,它可能适得其反:具有少量术语的文档被认为比具有多个术语的文档更“相关” 。使用Lucene,你会得到它的工作,但你必须弄脏你的手。

你基本上要做的是boost your title field,所以它变得更加相关。您也可以change the scoring mechanism为拥有更多信息的文档分配更高的分数。

玩得开心。如果你无法弄明白,Lucene mailinglist就有很好的支持。

答案 1 :(得分:4)

我很确定Lucene就足够了。我们已经解决了类似的任务并且做得很好。以下是一些提示,我建议您回顾一下我在Lucene.Net的项目。

分类

  • 类别在db中表示为整数键,因此每个文档都有多个类型为Number的字段“CATEGORY”的实例。例如文档:[1,2,5,10,'Wheel'] - 表示轮属于每个类别。

不可搜索的字段(徽标,社交个人资料):

  • 当然,您可以在lucene的非索引字段中存储不可搜索的值。但我们已将所有与产品相关的信息存储在DB中,以避免重建Lucene的索引。所以Lucene只拥有产品ID和索引但存储了关键字段的值。

三种语言和多个字段:

  • 我们只有2种语言。因此,不同的产品标题可以存储在相同的Lucene文档中,并且与产品的单个ID相关(就像我在ID之前写的那样是指DB)。这使您即使用户请求使用混合语言也可以搜索产品。
  • 显然标题,标签和说明对搜索结果有不同的权重。 Lucene通过分配场重来处理它。

答案 2 :(得分:2)

我将尝试添加Matthijs,Dewfy和Karussell的精美答案。 基本上,您正在尝试提高搜索相关性。 我建议你阅读Grant Ingersoll的Debugging Search Application Relevance Issues和他的Optimizing Findability in Lucene and Solr,以及他的Practical Relevance slides

对于不同的语言和分面,我建议您使用Solr。它是一个使用Lucene构建的搜索引擎,易于使用。它可以通过对每种语言使用不同的Solr Core来支持多种语言。

答案 3 :(得分:1)

Lucene或Solr会做这个工作。 Solr建立在lucene see here for more info

之上

我会选择solr。下载+设置简单快捷。开始使用本教程和我的link collection。使用solr可以很好地使用相关性并且很容易调整。

看看Dewfy和Matthijs Bierman的一些好点。

然后选择dismax查询处理程序,您可以选择具有特定属性的文档。

E.g。对于完整配置文件的百分比,您可以定义一个单独的字段'profile_completness',然后您可以将profile_completeness添加到dismax处理程序的bf(boostfunction):配置文件越完整,这些文档将被提升得越多。

我之前提到您可以轻松调整相关性:例如你可以设置bf到某事。喜欢:bf=title^10 tags^5 profile_completeness^1

“可能带有徽标的”可以通过提升查询来解决:bq=logo:[* TO *]^1。其中logo:[* TO *]表示“仅包含字段徽标的文档”

要显示深层嵌套的类别树,您需要在内存中创建该树,并使用特殊导入来提供solr。我们有一个工作的应用程序。您可以使用our approach

如果您需要进一步的帮助,请随时发表评论。