什么分析仪对我的情况有好处?休眠搜索案例

时间:2011-06-03 03:16:28

标签: hibernate lucene hibernate-search analyzer

我们正在运行图书搜索应用。它由hibernate搜索实现。

图书实体定义如下:

@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年在搜索中不那么重要。但对于那次搜索,微软,访问或2007没有区别。

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

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

另一个搜索示例:“盐湖城”,“美国”,如果只匹配盐,城市或湖泊,或者至少,他们应该落后于“盐湖城”的结果,预计结果不会。

有人能给我一些线索吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我不知道如何区分好的2007和坏的。

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

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

另一个解决方案是忽略自定义过滤器中的某些数字模式(即年份数字,单位数字等):这些是您最不希望忽略的最常见的嘈杂数字类型(这就是我想要的首先我想)。

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

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

查询DSL的整个文档是here

答案 1 :(得分:0)

Lucene应该已经对经常出现的条款进行折扣,因此不会在文件中区别对待。如果你想增加这种效果,你有几个选择:

  1. 更改默认设置中的相似度功能,并使用新功能以不同方式加权术语
  2. 通过首先查找包含给定术语的文档数量并相应地调整该术语的权重来提高查询中的低df(高idf)术语
  3. 写一个分类器,可以先验地决定哪些条款不会有效(例如年份数字),并相应地调整它们的权重
  4. 使用WordNet或维基百科之类的东西作为短语来源(例如,领导技能),您将其作为单个标记索引。这将涉及由分析仪配置的修改后的TokenStream。