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

时间:2014-09-12 00:13:29

标签: java search lucene analyzer

首先,抱歉我的英语不好!

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

任何想法如何执行它?

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

我看到Boosting查询条款和/或使用RegEx可能是一个选项,但这意味着,我必须手动处理用户输入。没有"开箱即用"解决方案(如功能,过滤器或分析器)?

非常感谢!

1 个答案:

答案 0 :(得分:0)

您的"Mohammad Omar"查询在代码方面如何?如果您只需要这个完整的词组,请将此字符串提供给PhraseQuery,或者如果您使用QueryParser,请将此词组换成引号以生成PhraseQuery

如果您在搜索结果中同时需要此短语以及包含这两个术语的文档,则可以将"Mohammad Omar"作为短语(如上所述)和单独的术语包含在内,如下所示:{{ 1}}。您还可以为短语元素添加提升,以便短语结果排名更高。