首先,抱歉我的英语不好!
我是Lucene图书馆的新手(自上周三以来),我试图了解如何根据找到的条款获得匹配文档的最佳相关性水平。
我使用Lucene 4.10.0(无Solr)
我能够索引/搜索英语/阿拉伯语文本以及支持这些文本的点击突出显示。
现在我对搜索结果的相关性存在疑问。
如果我搜索" Mohammad Omar"在三个文档中:
doc1.add(new TextField("contents", "xyz abc, 123 Mohammad Abu Omar 123", Field.Store.YES));
indexWriter.addDocument(config.build(taxoWriter, doc1));
doc2 = new Document();
doc2.add(new TextField("contents", "xyz abc, 123 Omar bin Mohammad 123", Field.Store.YES));
indexWriter.addDocument(config.build(taxoWriter, doc2));
doc3 = new Document();
doc3.add(new TextField("contents", "xyz abc, 123 Abu Mohammad Omar 123", Field.Store.YES));
indexWriter.addDocument(config.build(taxoWriter, doc3));
...etc
我对这3个文档得分相同。
看起来Lucene忽略了单词顺序,只是在匹配计数上得分。
我希望以下结果为最佳结果:
doc3那么doc1那么doc2
但我明白了:
doc1那么doc2那么doc3(所有人都有同样的分数)
用于搜索小写和子字符串我使用扩展分析器,如下所示:
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer source = new WhitespaceTokenizer(reader);
TokenStream filter = new LowerCaseFilter(source);
filter = new WordDelimiterFilter(filter,Integer.MAX_VALUE,null);
return new TokenStreamComponents(source, filter);
}
任何想法如何执行它?
我看到Boosting查询条款和/或使用RegEx可能是一个选项,但这意味着,我必须手动处理用户输入。没有"开箱即用"解决方案(如功能,过滤器或分析器)?
非常感谢!答案 0 :(得分:0)
您的"Mohammad Omar"
查询在代码方面如何?如果您只需要这个完整的词组,请将此字符串提供给PhraseQuery
,或者如果您使用QueryParser
,请将此词组换成引号以生成PhraseQuery
。
如果您在搜索结果中同时需要此短语以及包含这两个术语的文档,则可以将"Mohammad Omar"
作为短语(如上所述)和单独的术语包含在内,如下所示:{{ 1}}。您还可以为短语元素添加提升,以便短语结果排名更高。