如何使用Apache Lucene获得精确的搜索结果?

时间:2017-05-26 03:42:59

标签: java hibernate lucene hibernate-search

如何使用Apache Lucene获得最佳得分搜索?

1. State Authority
2. Authority State

现在用户搜索"权威状态"或者"国家管理局",我们以上述方式获得相同的结果。但对于"权威国家"搜索结果应为

1. Authority State
2. State Authority

以下是字段上的lucene查询:

name:Authority State* 
name:Authority State
name:Authority*
name:State*

for (String field : INDEXED_FIELDS) {
           bool.should(qb.keyword().wildcard().onField(field).matching(userInputBuilder.toString()).createQuery());
        }

        for (String field : INDEXED_FIELDS) {
          for (String match : pattern) {
               bool.should(qb.keyword().onField(field).matching(match).createQuery());
          }
        }

结果没有排序。

有人可以建议如何获得准确的结果吗?

1 个答案:

答案 0 :(得分:0)

关键字查询类型只是为了匹配输入的相同标记,而不考虑订单。

如果您需要它来考虑短语中令牌的顺序,请使用短语查询:

Query query = queryBuilder
                .phrase()
                    .withSlop( 2 )//or other options of the Phrase query
                    .onField( field )
                    .sentence( userInputBuilder.toString() )
                .createQuery();

您可能还有兴趣尝试最新的"Simple Query Builder"

如果您对"调试"感兴趣分数,你可以让查询引擎输出不仅仅是结果,还有每个命中使用的分数值和评估公式:

List<Object[]> results = (List<Object[]>) fullTextSession
    .createFullTextQuery( mltQuery, Coffee.class )
    .setProjection( ProjectionConstants.THIS, ProjectionConstants.SCORE, ProjectionConstants.EXPLANATION )
    .list();

对于每次点击,这将为您提供三个元素的数组:

  1. 匹配的实体实例
  2. 得分值
  3. 一个字符串,解释它是如何得分的