2016-08-03 1 views
0

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); 
} 

Répondre

0

Eh bien, J'ai décidé de jeter un oeil à MoreLokeThis et j'ai trouvé la réponse.

Le Query query = mlt.like("content", sReader); appelle la méthode createQueue(Map<String, Int> words) dans MoreLokeCette classe. À l'intérieur, les termes/mots à jetons de sReader (qui ont été convertis en Map) sont vérifiés par rapport à l'index.

Seuls les termes/mots présents dans l'index sont utilisés pour créer une requête. En utilisant l'exemple que j'ai fourni, puisque mon index contient seulement un document avec le mot erro, c'est le seul mot qui est gardé de la phrase que j'ai passée.