2

我们正在运行一个图书搜索应用程序。它是通过休眠搜索实现的。

书籍实体定义如下:

@Entity
@Indexed
public class Book{
@DocumentId
private Integer UID;
@Field
private String title;

@Field
private String description;
...}

如果用户搜索书名,比如说他们输入 Microsoft access 2007,则书名或描述包含 microsoft,则返回 access 或 2007。这正是我们所期望的。由于关键字 2007,有些书完全不相关。我正在寻找一种解决方案来了解每个关键字的重要性。在这种情况下,2007 年在搜索中的重要性较低。但对于那个搜索,microsoft、access 或 2007 没有区别。

第二个用户案例:是否有一个好的分析器可以用于索引和查询以支持多个短语?我认为休眠搜索的默认分析器只是将搜索词标记为单个词?

如果搜索词是 microsoft access 2007,如果结果包含“microsoft access”,则结果得分最高,

另一个搜索示例:“盐湖城”、“美国”,如果仅匹配盐、城市或湖泊,则不会出现预期结果,或者至少,它们应该在“盐湖城”的结果后面。

谁能给我一些线索?

谢谢!

4

2 回答 2

0

我不知道如何区分好的 2007 年和糟糕的 2007 年。

您可以做的一件事是使用忽略数字进行描述但使用常规分析器进行标题的分析器。这样只有标题中的数字会被选中。实际上,它不是一个完整的分析器,而是一个简单的过滤器,您可以编写并添加到分析器堆栈中。

您还可以索引描述两次,一次忽略数字,一次不忽略数字。然后,您可以在查询时使用提升因子来搜索这两个字段,但给带有数字的字段一个低优先级。

另一种解决方案是在您的自定义过滤器中忽略一些数字模式(即年份风格的数字、个位数的数字等):这些将是您希望忽略的最常见的嘈杂数字类型(我认为这就是我首先要做的) )。

至于词组搜索,只需使用 Lucene 的 PhraseQuery 或使用更友好的 Hibernate Search DSL,

Query luceneQuery = mythQB
   .phrase()
   .onField("history")
   .matching("Thou shalt not kill")
       .createQuery();

查询 DSL 的完整文档在这里

于 2011-06-03T09:09:01.943 回答
0

Lucene 应该已经忽略了频繁出现的术语,因此不能很好地区分文档。如果你想增加这种效果,你有几个选择:

  1. 更改默认的相似度函数,并使用新函数对术语进行不同的加权
  2. 通过首先查找包含给定术语的文档数量,并相应地调整该术语的权重来提升查询中的低 df(高 idf)术语
  3. 编写一个分类器,可以先验地决定哪些术语不会那么有效(例如,年份数字),并相应地调整它们的权重
  4. 使用 WordNet 或 Wikipedia 之类的东西作为短语(例如,领导技能)的来源,您可以将它们作为单个标记进行索引。这将涉及分析器配置的修改后的 TokenStream。
于 2011-06-03T21:55:35.663 回答