我正在尝试使用Lucene(5.4.1)MoreLikeThis来标记(分类)文本。它有点工作,但我的结果很差,我认为这个问题与Query对象有关。
示例下方有效,但最高的topdoc不是我期望的那个。通过调试查询对象,它仅显示content:erro
。从完整的葡萄牙语短语(参见示例)中,查询只用一个单词构建。
我没有使用停用词或任何其他类型的过滤器。
那么为什么lucene只选择 erro 作为查询字词?
初始化主要对象
Analyzer analyzer = new PortugueseAnalyzer();
Directory indexDir = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
索引
try (IndexWriter indexWriter = new IndexWriter(indexDir, config)) {
FieldType type = new FieldType();
type.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
type.setStored(true);
type.setStoreTermVectors(true);
Document doc = new Document();
doc.add(new StringField("id", "880b2bbc", Store.YES));
doc.add(new Field("content", "erro", type));
doc.add(new Field("tag", "atag", type));
indexWriter.addDocument(doc);
indexWriter.commit();
}
搜索
try (IndexReader idxReader = DirectoryReader.open(indexDir)) {
IndexSearcher indexSearcher = new IndexSearcher(idxReader);
MoreLikeThis mlt = new MoreLikeThis(idxReader);
mlt.setMinTermFreq(0);
mlt.setMinDocFreq(0);
mlt.setFieldNames(new String[] { "content" });
mlt.setAnalyzer(analyzer);
Reader sReader = new StringReader("Melhorias no controle de sessão no sistema qquercoisa quando expira, ao logar novamente no sistema é exibido o erro "xpto");
Query query = mlt.like("content", sReader);
TopDocs topDocs = indexSearcher.search(query, 3);
}
答案 0 :(得分:0)
好吧,我决定看看MoreLokeThis课程,我找到了答案。
Query query = mlt.like("content", sReader);
调用MoreLokeThis类中的createQueue(Map<String, Int> words)
方法。
在其中,来自sReader
的标记化术语/单词(已转换为Map
)将根据索引进行检查。
仅使用索引中存在的术语/单词来创建查询。
使用我提供的示例,因为我的索引只包含一个带有 erro 一词的文档,所以这是唯一一个与我传递的短语不同的词。