簡體   English   中英

如何在Lucene.NET中搜索Field.Index.NOT_ANALYZED字段?

[英]How to search a Field.Index.NOT_ANALYZED field in Lucene.NET?

我是Lucene.NET的新手。 我正在添加字段

Field.Index.NOT_ANALYZED

在Lucene文檔中。 有一個默認字段在文檔中添加為

Field.Index.ANALYZED

我在搜索默認字段時沒有任何困難; 但是當我搜索特定字段時,Lucene返回0文檔。 但是,如果我改變,

Field.Index.NOT_ANALYZED

Field.Index.ANALYZED

事情正常。 我認為與Analyzer有關。 任何人都可以指導我如何搜索Field.Index.NOT_ANALYZED字段嗎?

以下是我創建查詢解析器的方法:

QueryParser parser = 
    new QueryParser(
        Version.LUCENE_30, 
        "content", 
        new StandardAnalyzer(Version.LUCENE_30));

ANALYZED只表示該值在被索引之前通過Analyzer傳遞,而NOT_ANALYZED表示該值將按原樣索引。 后者意味着像“hello world”這樣的值將被編入索引,就像字符串“hello world”一樣。 但是,QueryParser類的語法將空格解析為term-separator,創建兩個術語“hello”和“world”。

如果您創建了一個var q = new TermQuery(new Term(field, "hello world"))而不是調用var q = queryParser.Parse(field, "hello world")您將能夠匹配該字段。

問題似乎是使用與字面上與當前索引的值不匹配的搜索值; 換句話說,嘗試將包含hello world文檔與搜索Hello World進行匹配。 由於所有字段都標記為NOT_ANALYZED Lucene不處理(使用分析器/標記器)條款; 它只是在傳遞時進行索引,將hello world之類的字符串存儲為hello world 要搜索返回該文檔的匹配項,搜索項必須完全正確

hello world 

不是Hello Worldhello world。 你好 所有這些搜索都將返回匹配。 對於Lucene來說,這就像試圖搜索數字3 ,得到24的匹配(聽起來不合邏輯)。

這就是為什么NOT_ANALYZED的使用僅建議用於您希望搜索返回完全匹配的ID類型字段,而不是相關/類似字段值的列表。

使用ANALYZED的優勢在於搜索變得更加直觀和友好。 索引像hello world這樣的值會將該術語分解為標記(以提供像helloworld或甚至ello的部分匹配)並以全小寫形式存儲,以避免由於不同的大小寫(如Hello WorldhELLO )而導致的不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM