14
lucene #lucene

lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

Page 1: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

lucene

#lucene

Page 2: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

Table des matières

À propos 1

Chapitre 1: Démarrer avec lucene 2

Remarques 2

Versions 2

Examples 2

Installer 2

Bonjour le monde 3

Chapitre 2: Requêtes 5

Examples 5

BooleanQuery 5

PhraseQuery 6

DisjunctionMaxQuery 6

Booster les requêtes 6

Chapitre 3: Suppression de documents à l'aide d'une requête à plusieurs termes 8

Introduction 8

Syntaxe 8

Remarques 8

Mises en garde avec le choix de l'analyseur 8

Examples 8

Choix de l'analyseur 8

Analyseur de requête 9

API de requête 9

Supprimer les documents correspondant à la requête 9

Chapitre 4: Une analyse 11

Examples 11

Créer un analyseur personnalisé 11

Itération manuelle à travers les jetons analysés 11

Crédits 12

Page 3: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

À propos

You can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: lucene

It is an unofficial and free lucene ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official lucene.

The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor accurate, please send your feedback and corrections to [email protected]

https://riptutorial.com/fr/home 1

Page 4: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

Chapitre 1: Démarrer avec lucene

Remarques

Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java.

Versions

Version Date de sortie

2.9.4 2010-12-03

3.0.3 2010-12-03

3.6.2 2013-01-16

4.10.4 2015-10-14

5.5.2 2016-06-24

6.3.0 2016-11-08

Examples

Installer

Lucene est une bibliothèque Java. Si vous ne disposez pas déjà d'un environnement de développement Java, consultez la documentation Java .

Téléchargez la dernière version de Lucene à partir du site Web Apache et décompressez-la.

Ajoutez les jars requis à votre chemin de classe. Les jars suivants seront requis par de nombreux projets, y compris l'exemple Hello World ici:

core/lucene-core-6.1.0.jar : fonctionnalité Core Lucene.•core/analysis/common/lucene-analyzers-common-6.1.0.jar : fournit une variété d'analyseurs, y compris le standard core/analysis/common/lucene-analyzers-common-6.1.0.jar .

queryparser/lucene-queryparser-6.1.0.jar : fournit l'analyseur de requête.•

Placez le code dans HelloLucene.java . Compilez-le avec cette commande:

javac -classpath "core/*:queryparser/*" HelloLucene.java

Et lancez-le avec cette commande:

https://riptutorial.com/fr/home 2

Page 5: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

java -classpath ".:core/*:queryparser/*" HelloLucene

Bonjour le monde

Cet exemple de base de Lucene crée un index simple et y recherche.

Remarque: RAMDirectory crée un index résidant en mémoire, ce qui est pratique pour l'expérimentation et le test, mais dans la pratique, la plupart des utilisateurs devront avoir un index stocké dans le système de fichiers (voir FSDirectory.open ).

import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.*; import org.apache.lucene.index.*; import org.apache.lucene.queryparser.classic.*; import org.apache.lucene.search.*; import org.apache.lucene.store.*; public class HelloLucene { public static void main(String[] args) throws IOException, ParseException { //Create a new index and open a writer Directory dir = new RAMDirectory(); Analyzer analyzer = new StandardAnalyzer(); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter writer = new IndexWriter(dir, config); //Create a document to index Document doc = new Document(); doc.add(new TextField("text", "Hello World!", Field.Store.YES)); //Index the document and close the writer System.out.println("Indexing document: " + doc); writer.addDocument(doc); writer.close(); //Open an IndexSearcher IndexReader reader = DirectoryReader.open(dir); IndexSearcher searcher = new IndexSearcher(reader); //Create a query QueryParser parser = new QueryParser("text", analyzer); Query query = parser.parse("world"); //Search for results of the query in the index System.out.println("Searching for: \"" + query + "\""); TopDocs results = searcher.search(query, 10); for (ScoreDoc result : results.scoreDocs) { Document resultDoc = searcher.doc(result.doc); System.out.println("score: " + result.score + " -- text: " + resultDoc.get("text")); } reader.close(); } }

https://riptutorial.com/fr/home 3

Page 6: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

Lire Démarrer avec lucene en ligne: https://riptutorial.com/fr/lucene/topic/3132/demarrer-avec-lucene

https://riptutorial.com/fr/home 4

Page 7: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

Chapitre 2: Requêtes

Examples

BooleanQuery

BooleanQuery est utilisé pour combiner d'autres requêtes.

Ils peuvent être combinés en utilisant trois paramètres BooleanClause.Occur:

BooleanClause.Occur.MUST - La sous-requête doit correspondre.•BooleanClause.Occur.SHOULD - La sous-requête peut ne pas correspondre, mais sera BooleanClause.Occur.SHOULD plus fortement si c'est le cas. S'il n'y a pas de clause MUST, au moins une clause SHOULD doit correspondre.

BooleanClause.Occur.MUST_NOT - La sous-requête ne doit pas correspondre au document.•

Dans cet exemple, un document correspondra s'il a "important", mais pas "interdit", et obtiendra un score plus élevé s'il a aussi "utile".

Query importantQuery = new TermQuery(new Term("fieldname", "important")); Query optionalQuery = new TermQuery(new Term("fieldname", "helpful")); Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden")); BooleanQuery query = new BooleanQuery.Builder() .add(importantQuery, BooleanClause.Occur.MUST) .add(optionalQuery, BooleanClause.Occur.SHOULD) .add(forbidQuery, BooleanClause.Occur.MUST_NOT) .build();

Vous pouvez également spécifier le nombre minimum de clauses à faire correspondre:

Query query1 = new TermQuery(new Term("fieldname", "one")); Query query2 = new TermQuery(new Term("fieldname", "two")); Query query3 = new TermQuery(new Term("fieldname", "three")); BooleanQuery query = new BooleanQuery.Builder() .add(query1, BooleanClause.Occur.SHOULD) .add(query2, BooleanClause.Occur.SHOULD) .add(query3, BooleanClause.Occur.SHOULD) .setMinimumNumberShouldMatch(2) .build();

Gotcha: Les clauses avec BooleanClause.Occur.MUST_NOT ne correspondent pas à tout le reste, elles n'éliminent que les correspondances. Votre BooleanQuery doit avoir au moins un MUST ou SHOULD clause, ou il ne correspond. Ceci, par exemple, ne fonctionnera PAS :

//***This does NOT work!*** Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden")); BooleanQuery getEverythingElseQuery = new BooleanQuery.Builder() .add(forbidQuery, BooleanClause.Occur.MUST_NOT) .build();

https://riptutorial.com/fr/home 5

Page 8: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

PhraseQuery

PhraseQuery est utilisé pour rechercher une séquence de termes. Ce qui suit correspond à la phrase "Hello World" (après avoir été indexé avec StandardAnalyzer )

Query query = new PhraseQuery.Builder() .add(new Term("text", "hello")) .add(new Term("text", "world")) .build();

PhraseQuery peut également gérer un "slop", ou des termes supplémentaires dans une requête, en définissant une distance de montage maximale avec setSlop . Cela correspondra à "Lorem ipsum sit amet dolor":

Query query = new PhraseQuery.Builder() .add(new Term("text", "lorem")) .add(new Term("text", "amet")) .setSlop(2) .build();

Vous pouvez également définir des incréments de position exacts:

Query query = new PhraseQuery.Builder() .add(new Term("text", "lorem"), 0) .add(new Term("text", "sit"), 2) .add(new Term("text", "dolor"), 4) .build();

DisjunctionMaxQuery

Cela combine des requêtes telles que la meilleure correspondance (c'est-à-dire la plus élevée) de ses sous-requêtes contribue au score final.

List<Query> disjuncts = new ArrayList<Query>(); disjuncts.add(new TermQuery(new Term("fieldname", "hello"))); disjuncts.add(new TermQuery(new Term("fieldname", "world"))); Query query = new DisjunctionMaxQuery(disjuncts, 0.0f);

Le second argument du constructeur DisjunctionMaxQuery est une valeur de bris d'égalité qui, lorsqu'elle est différente de zéro, permet aux correspondances non maximales d'apporter une petite contribution au score, afin de rompre les liens. Il devrait généralement être petit (de l'ordre de 0,1).

Booster les requêtes

Une requête peut être augmentée pour augmenter son score par rapport aux autres sous-requêtes. Ceci est fait en l'enveloppant avec un BoostQuery

Query lessRelevantQuery = new TermQuery(new Term("fieldname", "ipsum")); //Five times as interesting

https://riptutorial.com/fr/home 6

Page 9: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

Query highlyRelevantQuery = new BoostQuery( new TermQuery(new Term("fieldname", "lorem")), 5.0f); BooleanQuery query = new BooleanQuery.Builder() .add(lessRelevantQuery, BooleanClause.Occur.SHOULD) .add(highlyRelevantQuery, BooleanClause.Occur.SHOULD) .build();

Lire Requêtes en ligne: https://riptutorial.com/fr/lucene/topic/5614/requetes

https://riptutorial.com/fr/home 7

Page 10: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

Chapitre 3: Suppression de documents à l'aide d'une requête à plusieurs termes

Introduction

La suppression de documents d'un index Lucene est simple lorsque vous avez un champ clé primaire dans votre document (comme dans les bases de données SQL traditionnelles).

Toutefois, vous avez parfois besoin de supprimer un certain nombre de documents basés sur plusieurs champs du document. L'API Lucene vous permet d'y parvenir en spécifiant une requête à utiliser pour la suppression.

Pour ce faire, sélectionnez le bon analyseur, créez la requête, transmettez la requête à indexWriter pour supprimer les documents.

Syntaxe

indexWriter.deleteDocuments (multiTermQuery);1. Requête multiTermQuery = new QueryParser ("", analyseur) .parse ("nom_zone1:" valeur du champ 1 "AND nom_du_2):" valeur du champ 2 "");

2.

BooleanQuery multiTermQuery = new BooleanQuery (); multiTermQuery.add (new TermQuery (new Term ("nom_zone1", "valeur du champ 1")), BooleanClause.Occur.MUST); multiTermQuery.add (new TermQuery (nouveau terme ("nom_zone2", "valeur du champ 2")), BooleanClause.Occur.MUST);

3.

Remarques

Mises en garde avec le choix de l'analyseur

Ce n'est pas immédiatement évident, mais l'analyseur que vous utilisez fait une énorme différence dans la façon dont votre requête est exécutée. Ceci est dû au fait que StandardAnalyzer filtre les mots anglais courants tels que "the" et "a". Vous pouvez choisir un analyseur différent (comme KeywordAnalyzer) pour qu'il corresponde exactement. Cela dépend évidemment de votre application de Lucene bien sûr.

Examples

Choix de l'analyseur

Tout d'abord, observez l'analyseur que vous utilisez. J'ai été déconcerté pendant un moment seulement pour réaliser que le StandardAnalyzer filtre les mots communs tels que «le» et «a». Ceci est un problème lorsque votre champ a la valeur 'A'. Vous voudrez peut-être envisager le

https://riptutorial.com/fr/home 8

Page 11: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

KeywordAnalyzer:

Voir ce post autour de l'analyseur.

// Create an analyzer: // NOTE: We want the keyword analyzer so that it doesn't strip or alter any terms: // In our example, the Standard Analyzer removes the term 'A' because it is a common English word. // http://stackoverflow.com/a/9071806/231860 KeywordAnalyzer analyzer = new KeywordAnalyzer();

Analyseur de requête

Ensuite, vous pouvez soit créer votre requête en utilisant le QueryParser:

Voir ce post sur le remplacement de l'opérateur par défaut.

// Create a query parser without a default field in this example (the first argument): QueryParser queryParser = new QueryParser("", analyzer); // Optionally, set the default operator to be AND (we leave it the default OR): // http://stackoverflow.com/a/9084178/231860 // queryParser.setDefaultOperator(QueryParser.Operator.AND); // Parse the query: Query multiTermQuery = queryParser.parse("field_name1:\"field value 1\" AND field_name2:\"field value 2\"");

API de requête

Ou vous pouvez obtenir la même chose en construisant vous-même la requête en utilisant son API:

Voir ce tutoriel sur la création de BooleanQuery.

BooleanQuery multiTermQuery = new BooleanQuery(); multiTermQuery.add(new TermQuery(new Term("field_name1", "field value 1")), BooleanClause.Occur.MUST); multiTermQuery.add(new TermQuery(new Term("field_name2", "field value 2")), BooleanClause.Occur.MUST);

Supprimer les documents correspondant à la requête

Ensuite, nous transmettons enfin la requête à l'auteur pour supprimer les documents correspondant à la requête:

Voir la réponse à cette question.

Voir l'API ici

// Remove the document by using a multi key query: // http://www.avajava.com/tutorials/lessons/how-do-i-combine-queries-with-a-boolean-query.html

https://riptutorial.com/fr/home 9

Page 12: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

indexWriter.deleteDocuments(multiTermQuery);

Lire Suppression de documents à l'aide d'une requête à plusieurs termes en ligne: https://riptutorial.com/fr/lucene/topic/9959/suppression-de-documents-a-l-aide-d-une-requete-a-plusieurs-termes

https://riptutorial.com/fr/home 10

Page 13: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

Chapitre 4: Une analyse

Examples

Créer un analyseur personnalisé

La plupart de la personnalisation de l'analyse se trouve dans la classe createComponents , où les Tokenizer et les TokenFilters sont définis.

Les CharFilters peuvent être ajoutés dans la méthode initReader .

Analyzer analyzer = new Analyzer() { @Override protected Reader initReader(String fieldName, Reader reader) { return new HTMLStripCharFilter(reader); } @Override protected TokenStreamComponents createComponents(String fieldName) { Tokenizer tokenizer = new StandardTokenizer(); TokenStream stream = new StandardFilter(tokenizer); //Order matters! If LowerCaseFilter and StopFilter were swapped here, StopFilter's //matching would be case sensitive, so "the" would be eliminated, but not "The" stream = new LowerCaseFilter(stream); stream = new StopFilter(stream, StopAnalyzer.ENGLISH_STOP_WORDS_SET); return new TokenStreamComponents(tokenizer, stream); } };

Itération manuelle à travers les jetons analysés

TokenStream stream = myAnalyzer.tokenStream("myField", textToAnalyze); stream.addAttribute(CharTermAttribute.class); stream.reset(); while(stream.incrementToken()) { CharTermAttribute token = stream.getAttribute(CharTermAttribute.class); System.out.println(token.toString()); } stream.close();

Un certain nombre d' attributs sont disponibles. Le plus commun est CharTermAttribute , qui est utilisé pour obtenir le terme analysé en tant que chaîne.

Lire Une analyse en ligne: https://riptutorial.com/fr/lucene/topic/4830/une-analyse

https://riptutorial.com/fr/home 11

Page 14: lucene · 2019. 1. 18. · Chapitre 1: Démarrer avec lucene Remarques Apache Lucene est une bibliothèque de recherche en texte intégral basée sur Java. Versions Version Date de

Crédits

S. No

Chapitres Contributeurs

1Démarrer avec lucene

Community, femtoRgon, Hamid Rohani, Heidar

2 Requêtes femtoRgon

3

Suppression de documents à l'aide d'une requête à plusieurs termes

Luke Machowski

4 Une analyse femtoRgon

https://riptutorial.com/fr/home 12