我在索引期间使用过滤器 EdgeNGramTokenFilter
。
当我寻找一个词时。当 Lucene 找到完整单词或另一个单词的一部分时,它的评分不会产生差异。
例如,如果我正在查找单词 PUB。我希望在结果顶部看到每个 PUB,并且仅在 PUBLIC 一词之后。
谢谢
我找到了解决方案:
我创建两个字段,一个将被分析(edgeNgrams),一个不会被分析
TextField field = new TextField(FULLTEXT_COL, value, Field.Store.NO);
d.add(field);
//exact search
Field exactField = new TextField(FullTextIndexationManager.EXACT_COL + FULLTEXT_COL, value, Field.Store.NO);
d.add(exactField);
我使用 PerFieldAnalyzerWrapper 来分配分析器
Map<String, Analyzer> analyzerPerField = new HashMap<>();
analyzerPerField.put(FullTextIndexationManager.EXACT_COL + FULLTEXT_COL, new StandardAnalyzer(Version.LUCENE_44));
PerFieldAnalyzerWrapper aWrapper = new PerFieldAnalyzerWrapper(customAnalyzer, analyzerPerField);
当我在两个字段中搜索时
keys.add(FullTextIndexationManager.FULLTEXT_COL);
values.add(QueryParser.escape(value));
occurs.add(BooleanClause.Occur.SHOULD);
//exact search
keys.add(FullTextIndexationManager.EXACT_COL+FullTextIndexationManager.FULLTEXT_COL);
values.add(QueryParser.escape(value));
occurs.add(BooleanClause.Occur.SHOULD);
Query q = MultiFieldQueryParser.parse(Version.LUCENE_44, queries, fields, flags, ontologySearch.getAnalyzer());
当我找到一个确切的术语时,它会得分两倍
我是一名优秀的程序员,十分优秀!