Java Lucene Analyzer查询和搜索结果相关性得分
首先,很抱歉我的英语不好 我是Lucene图书馆的新手(从上周三开始),我试图了解如何根据找到的术语获得匹配文档的最佳相关性级别 我使用Lucene 4.10.0(无Solr) 我能够索引/搜索英语/阿拉伯语文本,并支持这些文本的点击突出显示 现在我对搜索结果的相关性有一个问题 如果我在三个文档中搜索“Mohammad Omar”:Java Lucene Analyzer查询和搜索结果相关性得分,java,search,lucene,analyzer,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.Sto
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);
}
你知道怎么做吗
从这里开始:
我认为增加查询条件和/或使用正则表达式可能是一种选择,但这意味着,我必须手动处理用户输入。难道没有“开箱即用”的解决方案(如函数、过滤器或分析器)吗
非常感谢 您的“Mohammad Omar”
查询在代码方面是什么样子的?如果您只需要这个短语,请将这个字符串输入到PhraseQuery
中,或者如果您使用QueryParser
,请将这个短语用引号括起来以生成PhraseQuery
如果您需要在搜索结果中同时使用此短语以及分别包含这两个术语的文档,您可以将
“Mohammad Omar”
作为短语(如上所述)和单独的术语包括在内,如下所示:some_字段:“Mohammad Omar”some_字段:Mohammad some_字段:Omar
。您还可以为短语元素添加增强功能,以便短语结果排名更高。谢谢您的回答,我使用queryParser,我需要包含精确短语+所有子短语的结果(术语顺序非常重要)。但是如果请求的短语很长,比如说30个单词,那么我是否需要手动构建所有子图片并将其放大?是否有现成的类来执行此操作?对于现成的解决方案,您可以将slop参数与PhraseQuery
一起使用,尽管它的工作原理稍有不同。请阅读我的答案以了解更多细节。关于我最初的建议-并不是每次都要手工重写;-)