我们正在运行图书搜索应用。它由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”,则结果得分最高,
另一个搜索示例:“盐湖城”,“美国”,如果只匹配盐,城市或湖泊,或者至少,他们应该落后于“盐湖城”的结果,预计结果不会。
有人能给我一些线索吗?
谢谢!
答案 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应该已经对经常出现的条款进行折扣,因此不会在文件中区别对待。如果你想增加这种效果,你有几个选择: