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 的文档,这是我传递的短语中唯一保留的单词。
我正在尝试使用 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 的文档,这是我传递的短语中唯一保留的单词。