2014-12-27 48 views
2

我正在尋找一種方式來精確匹配字段時,用戶包含在查詢中。Lucene查詢中的精確字段匹配

例如,假設我們有這些文檔:

  • 文件1:包羅萬象的 「世界你好」,主題: 「科學」
  • 文檔2:包羅萬象: 「再見世界」,主題:「生命科學」

如果主體的用戶搜索:科學界我希望僅返回doc1的,因爲它是受到完全匹配。但是,我收到了這兩個文檔。

我試圖索引主題與KeywordAnalyzer,但我得到這個錯誤:

java.lang.IllegalStateException: field "subject" was indexed without position data; cannot run Phrase Query 

回答

0

「主題」字段的錯誤可能是因爲你沒有長期矢量存儲在索引你的領域做(你在Lucene的代碼中使用StringField或文本字段?)

要保存期限矢量場,你應該用Field類Lucene的,而定義字段下使用盡可能的FieldType

FieldType fieldType = new FieldType(); 
    fieldType.setStoreTermVectors(true); 
    fieldType.setStoreTermVectorPositions(true); 
    fieldType.setIndexed(true); 
    fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS); 
    fieldType.setStored(true); 

具有高於場

doc.add(new Field("field_name", "data", fieldType)); 

現在第一個問題,我能想到的兩種方式

1)實現自定義相似度添加文件 - 您可以創建默認相似度衍生新的相似性類別,改變lenghtNorm法等你會優先使用「科學」而不是「生命科學」的文件,如何?根據比率(查詢中的匹配項/文檔中的總項)對每個文檔進行評分。正如你所看到的,更短和更相關的文件將以上述比例得到更好的評分。

2)後處理lucene返回的文件,以消除不需要的文件(不推薦) - 從Lucene獲取文件列表,並消除不符合您的搜索條件的不需要的文件。