2014-10-18 66 views
1

我有一個簡單的問題,我無法回答四處搜索或搜索其他問題:我正在索引一個字段,其中包含以下代碼的文件名:lucene如何在StringField中處理點('。')? (發佈索引和搜索文件名)

doc.add新的TextField(FIELD_FILENAME,文件名,Field.Store.YES))

如果我索引hello.jpg,然後用鍵'hello.jpg'搜索條目被打(迄今爲止好)。但是,如果我用'你好'搜索,我不會得到任何結果。如果我替換'。'與另一個標點符號,而索引然後它的作品。如果我逃避''。它也可以工作(例如索引「hello \ .jpg」,我發現它搜索'hello')。

Lucene如何處理點?我應該期待與其他角色相同的問題嗎?

非常感謝提前, 斯特凡諾

回答

1

一切都取決於你所使用的分析儀,因爲分析儀確定使用哪個分詞器。標記器負責標記提取,在最簡單的情況下,它與定義字邊界相似。

鑑於你所描述的行爲,我想你正在使用的StandardAnalyzer,它使用StandardTokenizer,它實現Unicode text segmentation,其中規定了以下內容:

例如,在期間(U + 002E FULL STOP)被模棱兩可地使用,有時用於句末,有時用於縮寫,有時用於數字。

在該文件中,句號字符是MidNumLet屬性值的一部分,您的具體情況由WB6和WB7規則處理:

(ALetter | Hebrew_Letter) × (MidLetter | MidNumLet | Single_Quote) (ALetter | Hebrew_Letter) 
(ALetter | Hebrew_Letter) (MidLetter | MidNumLet | Single_Quote) × (ALetter | Hebrew_Letter) 

×符號表示:無字這裏允許休息

更簡單:如果所述字符緊接在之後並且後面跟一個字母,則不允許在標點符號之前或之後進行單詞分詞。

,標準分詞的語法遵循以下規則:

// UAX#29 WB5. (ALetter | Hebrew_Letter) × (ALetter | Hebrew_Letter) 
//  WB6. (ALetter | Hebrew_Letter) × (MidLetter | MidNumLet | Single_Quote) (ALetter | Hebrew_Letter) 
//  WB7. (ALetter | Hebrew_Letter) (MidLetter | MidNumLet | Single_Quote) × (ALetter | Hebrew_Letter) 
//  WB7a. Hebrew_Letter × Single_Quote 
//  WB7b. Hebrew_Letter × Double_Quote Hebrew_Letter 
//  WB7c. Hebrew_Letter Double_Quote × Hebrew_Letter 
//  WB9. (ALetter | Hebrew_Letter) × Numeric 
//  WB10. Numeric × (ALetter | Hebrew_Letter) 
//  WB13. Katakana × Katakana 
//  WB13a. (ALetter | Hebrew_Letter | Numeric | Katakana | ExtendNumLet) × ExtendNumLet 
//  WB13b. ExtendNumLet × (ALetter | Hebrew_Letter | Numeric | Katakana) 
// 
{ExtendNumLetEx}* ({KatakanaEx}   ({ExtendNumLetEx}* {KatakanaEx}       )* 
        | ({HebrewLetterEx} ({SingleQuoteEx}  | {DoubleQuoteEx} {HebrewLetterEx} ) 
        | {NumericEx}   (({ExtendNumLetEx}* | {MidNumericEx}) {NumericEx}  )* 
        | {HebrewOrALetterEx} (({ExtendNumLetEx}* | {MidLetterEx} ) {HebrewOrALetterEx})* 
        )+ 
        ) 
({ExtendNumLetEx}+ ({KatakanaEx}   ({ExtendNumLetEx}* {KatakanaEx}       )* 
        | ({HebrewLetterEx} ({SingleQuoteEx}  | {DoubleQuoteEx} {HebrewLetterEx} ) 
        | {NumericEx}   (({ExtendNumLetEx}* | {MidNumericEx}) {NumericEx}  )* 
        | {HebrewOrALetterEx} (({ExtendNumLetEx}* | {MidLetterEx} ) {HebrewOrALetterEx})* 
        )+ 
        ) 
)* 
{ExtendNumLetEx}* 
    { return WORD_TYPE; } 

結論:
如果你需要一個不同的行爲,你必須使用一個不同的分析器,能夠更好地滿足您的目標。我猜想像LetterTokenizer不適合,但你可以創建自己的標記物基於CharTokenizer來實現自己的規則。

+0

多麼好的解釋!感謝盧卡斯。 – Ste 2014-10-19 14:22:26