2017-05-26 128 views
0

如何使用Apache Lucene獲得最佳分數搜索?如何使用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()); 
      } 
     } 

有成果不排序。

任何人都可以建議如何得到確切的結果嗎?

+0

你的Java代碼沒有很好地解釋。嘗試粘貼最終查詢字符串。另外,當您顯示結果順序時,他們有不同的分數嗎? –

回答

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. 一個字符串,解釋它如何得分