6

我正在尝试将 Lucene.net 合并到我的网络搜索中。

目前我有一个 lucene.net 索引,其中包含 +100 万个文档,每个文档有 7 个字段。最后一个字段是“全部”字段,它连接了前面字段的内容。搜索所有字段非常快:)

但我觉得在这里可以找到更多。如何在不使用“all”字段的情况下进行搜索,在所有字段中搜索一个或多个空格分隔的字符串?
我希望能够给某些领域赋予权重。此外,如果搜索包含有关命中发生地点的信息,那就太好了,这样我就可以在结果中显示它。

我认为这一切都是可能的,但我不知道如何。
有什么帮助吗?

4

3 回答 3

4

我们做类似的事情,诀窍是在查询字符串中指定字段:

(+Tier1:ribbon^1)^4 OR (+Tier2:ribbon^1)^4 OR (+Tier3:ribbon^1) OR (+Tier4:q*ribbon*^1)^12

在上面的示例中,用户在我们的应用程序中搜索了“ribbon”。我们在不同的字段中有不同的数据段,最终字段“Tier4”包含连接在一起的所有前面的术语。我们在字段前面加上“q”,所以我们可以做前导通配符,还有:

(+Tier4:q*ribbon*^1)^12

最后,我们使用插入符号 (^) 的提升。这最终会以不同的方式衡量事物。需要一段时间才能获得正确的提升,我仍然对它们不是 100% 满意,但它们确实产生了很大的影响。

于 2009-02-10T13:51:37.750 回答
3

我认为您不需要维护“全部”字段。

  1. 看看使用“MultiFieldQueryParser”。它不接受查询解析器使用的单个默认字段,而是接受字段名称数组(除了索引分析器)。
  2. 术语提升应该按照“QueryParser”工作(即不需要特殊操作)。我应该补充一点,我发现标准评分对我来说似乎没问题(字段长度、匹配数等),而无需使用增强术语。
  3. Lucene.Net(当然,目前肯定是 SVN 2.3 构建)包括来自 Java 源代码的 Highlight 包的一个端口。它确实有一些怪癖(其中最重要的一点是,一开始可能会很棘手),但它基本上是有效的。

祝你好运

于 2009-03-01T23:54:36.460 回答
1

你必须得到Lucene in Action。虽然关于原始(即 Java)Lucene 实现,但它包含您需要的所有信息:关于 boosts、highlighters、qwery 解析器等。

于 2009-02-10T13:50:36.007 回答