J'essaie d'utiliser Lucene (5.4.1) MoreLikeThis pour marquer (classifier) les textes. C'est un peu de travail, mais je reçois des résultats médiocres, et je pense que le problème est lié à l'objet de requête.Lucene limite les termes de la requête
L'exemple ci-dessous fonctionne, mais le topdoc le plus haut n'est pas celui auquel je m'attendais. En déboguant l'objet de requête, il affiche uniquement content:erro
. D'une phrase portugaise complète (voir dans l'exemple) la requête a été construite avec un seul mot. Je n'utilise pas de mots d'arrêt ou tout autre type de filtre.
Alors pourquoi Lucene sélectionne-t-il simplement erro comme terme de requête?
Init objets principaux
Analyzer analyzer = new PortugueseAnalyzer();
Directory indexDir = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
Indexer
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();
}
Pour rechercher
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);
}