Lucene Analyzer查询和搜索结果相关性评分



首先,对不起我的英语不好!

我是Lucene Library的新手(从上周三开始),我试图了解如何根据找到的术语获得匹配文档的最佳相关性级别。

我使用Lucene 4.10.0(无Solr)

我能够索引/搜索英语/阿拉伯语文本,并支持这些文本的突出显示。

现在我对搜索结果的相关性有一个问题。

如果我在三个文档中搜索"穆罕默德·奥马尔":

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);
   }

知道怎么表演吗?

从这里:http://lucene.apache.org/core/4_10_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#Boosting_a_Term

我看到使用RegEx增强查询条件AND/OR可能是一个选项,但这意味着,我必须手动处理用户输入。难道没有"开箱即用"的解决方案(如函数、过滤器或分析器)吗?

非常感谢!

您的"Mohammad Omar"查询在代码方面是什么样子的?如果您只需要这个确切的短语,请将此字符串输入到PhraseQuery中,或者如果您使用QueryParser,请将该短语括在引号中以生成PhraseQuery

如果您需要此短语以及在搜索结果中分别包含这两个术语的文档,则可以将"Mohammad Omar"作为短语(如上所述)和单独的术语包括在内,例如:some_field:"Mohammad Omar" some_field:Mohammad some_field:Omar。您还可以为短语元素添加boosting,以便短语结果排名更高。

最新更新