在CustomAnalyzer

时间:2017-07-29 05:44:38

标签: java apache solr lucene

我正在使用apache lucene 6.3.0而我正在尝试为我的索引实现一个自定义分析器,它允许搜索文件名。问题是我想允许用户也使用确切的文件名进行搜索,但是Analyzer只有单独的令牌而不是原始文件名作为令牌之一。

Analyzer analyzer = CustomAnalyzer.builder()
           .withTokenizer(StandardTokenizerFactory.class)
           .addTokenFilter(LowerCaseFilterFactory.class)
           .addTokenFilter(WordDelimiterFilterFactory.class)
           .build();  

输入: - power_shot_black_neo.txt

预期产出: -
power_shot_black_neo.txt
电力
拍摄


txt

实际输出: -
电力
拍摄


txt

2 个答案:

答案 0 :(得分:0)

你需要在'tokenizer'之前使用'character filter'juster来获取完整的字符串,因为tokenizer只考虑令牌和字符过滤器 - >字符过滤器用于在字符串被标记化之前“整理”字符串。

有关详细信息,请参阅以下网址:

https://www.elastic.co/guide/en/elasticsearch/guide/current/custom-analyzers.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-custom-analyzer.html

答案 1 :(得分:0)

由于您使用的是StandardTokenizer,它会按照指示对字符串进行标记。您可以使用KeywordTokenizer和WordDelimiterFilter,因为WordDelimiterFilter也应该能够保留原始令牌。

new WordDelimiterFilter(tokenizer, 
    GENERATE_WORD_PARTS |
    GENERATE_NUMBER_PARTS |
    SPLIT_ON_CASE_CHANGE |
    SPLIT_ON_NUMERICS |
    STEM_ENGLISH_POSSESSIVE |
    PRESERVE_ORIGINAL, /* this preserves the original token as well */
    ...
);

另一种选择是为确切的值设置不同的字段,这样您也可以对字段进行不同的评分/权衡。