【问题标题】:How to get exact search results on top using Apache Lucene?如何使用 Apache Lucene 在顶部获得准确的搜索结果?
【发布时间】:2017-05-26 03:42:59
【问题描述】:

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

1. State Authority
2. Authority State

现在用户搜索“Authority State”或“State Authority”,我们在上述方式中得到了相同的结果。但是对于“权威状态”的搜索结果应该是

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());
          }
        }

没有对结果进行排序。

谁能建议如何获得准确的结果?

【问题讨论】:

  • 您的 Java 代码解释得不是很好。尝试粘贴最终查询字符串。另外,当你显示结果的顺序时,它们有不同的分数吗?

标签: java hibernate lucene hibernate-search


【解决方案1】:

keyword 查询类型只是看起来匹配输入的相同标记,而不考虑顺序。

当您需要考虑短语中标记的顺序时,请使用 phrase 查询:

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. 解释如何评分的字符串

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2015-11-21
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多