Lucene限制查询条款

时间:2016-08-03 12:59:26

标签: java lucene morelikethis

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

1 个答案:

答案 0 :(得分:0)

好吧,我决定看看MoreLokeThis课程,我找到了答案。

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

在其中,来自sReader的标记化术语/单词(已转换为Map)将根据索引进行检查。

仅使用索引中存在的术语/单词来创建查询。

使用我提供的示例,因为我的索引只包含一个带有 erro 一词的文档,所以这是唯一一个与我传递的短语不同的词。