【问题标题】:how does lucene process dots ('.') in StringField? (issue indexing and searching file names)lucene如何处理StringField中的点('.')? (问题索引和搜索文件名)
【发布时间】:2014-10-19 19:33:22
【问题描述】:

我有一个简单的问题,我无法回答搜索或搜索其他问题:我正在索引一个包含具有以下代码的文件名的字段:

doc.add(new TextField(FIELD_FILENAME, filename, Field.Store.YES))

如果我索引 hello.jpg 然后我使用键 'hello.jpg' 进行搜索,则该条目被命中(到目前为止一切都很好)。但是,如果我用“你好”搜索,我不会得到任何结果。如果我替换 '.'在索引时使用另一个标点符号然后它可以工作。如果我逃避'。它也能正常工作(例如,索引“hello\.jpg”我发现它正在搜索“hello”)。

Lucene如何处理dots?我应该期待其他角色出现同样的问题吗?

提前非常感谢, 斯特凡诺

【问题讨论】:

    标签: 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 创建自己的标记器来实施您自己的规则。

    【讨论】:

      猜你喜欢
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多