Lucene 正在限制查询条件

Lucene is limiting the query terms

我正在尝试使用 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);
}

嗯,我决定看看 MoreLokeThis class,我找到了答案。

Query query = mlt.like("content", sReader);调用MoreLokeThis中的createQueue(Map<String, Int> words)方法class。

在其中,根据索引检查来自 sReader 的标记化 terms/words(已转换为 Map)。

只有存在于索引中的 terms/words 用于创建查询。

使用我提供的示例,因为我的索引只包含一个包含单词 erro 的文档,这是我传递的短语中唯一保留的单词。