我正在使用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
答案 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 */
...
);
另一种选择是为确切的值设置不同的字段,这样您也可以对字段进行不同的评分/权衡。