Maison >Java >javaDidacticiel >Explication détaillée de la configuration de Lucene et du code d'image et de texte pour la création d'index et la récupération de texte intégral

Explication détaillée de la configuration de Lucene et du code d'image et de texte pour la création d'index et la récupération de texte intégral

黄舟
黄舟original
2017-09-06 10:03:011568parcourir

Lucene


est une boîte à outils de moteur de recherche en texte intégral open source, mais ce n'est pas un moteur de recherche en texte intégral complet, mais une architecture de moteur de recherche en texte intégral qui fournit un moteur de requête complet et moteur d'indexation, partie moteur d'analyse de texte (deux langues occidentales, anglais et allemand). L'objectif de Lucene est de fournir aux développeurs de logiciels une boîte à outils simple et facile à utiliser pour implémenter facilement la fonction de recherche en texte intégral dans le système cible, ou pour créer un moteur de recherche en texte intégral complet basé sur celle-ci.

Avantages


(1) Le format du fichier d'index est indépendant de la plateforme d'application. Lucene définit un ensemble de formats de fichiers d'index basés sur des octets de 8 bits afin que des systèmes ou des applications compatibles sur différentes plates-formes puissent partager les fichiers d'index créés.

(2) Sur la base de l'index inversé du moteur de recherche en texte intégral traditionnel, une indexation par blocs est mise en œuvre, ce qui peut établir de petits index de fichiers pour les nouveaux fichiers et améliorer la vitesse d'indexation. Ensuite, grâce à la fusion avec l'index d'origine, l'objectif d'optimisation est atteint.

(3) L'excellente architecture système orientée objet facilite l'apprentissage des extensions Lucene et facilite l'expansion de nouvelles fonctions.

(4) Conception d'une interface d'analyse de texte indépendante de la langue et du format de fichier. L'indexeur termine la création de fichiers d'index en acceptant le flux de jetons. Les utilisateurs n'ont qu'à implémenter l'interface d'analyse de texte pour développer de nouvelles langues. et les formats de fichiers.

(5) Un ensemble de moteurs de requête puissants a été implémenté par défaut. Les utilisateurs n'ont pas besoin d'écrire leur propre code pour permettre au système d'obtenir de puissantes capacités de requête. L'implémentation de requêtes de Lucene implémente des opérations booléennes et des requêtes floues. par défaut (Fuzzy Search[11]), requête de groupe, etc.

Concept


Tout d'abord, vous pouvez jeter un œil à cette photo, qui circule depuis longtemps, à mon avis, c'est le cas. :

A gauche : c'est la collecte de diverses données, telles que en ligne, texte, base de données, etc., et les données collectées sont indexées via Lucene

À droite : c'est l'utilisateur via Certaines recherches, après indexation, sont un processus de retour de résultats

Configuration Lucene


Il est très simple d'importer quelques packages jar et de créer un fichier d'index

Je suis en utilisant la dernière version du package principal 6.6.0 : lucene-core-6.6.0.jar. Vous pouvez le télécharger sur le site officiel http://lucene.apache.org/. Ce package vous suffit pour le tester.

Le fichier d'index est : index. Vous pouvez choisir ce nom de fichier à volonté, car le contenu à l'intérieur est généré automatiquement, c'est-à-dire un répertoire d'index, vous pouvez télécharger l'outil en ligne pour le visualiser. , vous pouvez essayer

Cependant, ce package jar : IKAnalyzer6.5.0.jar est un package d'extension pour le traitement de la segmentation des mots de l'analyseur et prend en charge la segmentation des mots chinois. Ces deux répertoires sont au même niveau que le répertoire src <.>

Sans plus tarder, commençons par le code :

Tout d'abord, sur la base de la carte conceptuelle lucene ci-dessus, nous avons besoin pour créer un index en premier. J'ai lancé ces exceptions directement ici. En fait, elles doivent être traitées trop paresseuses

public static void createindex() throws Exception {
        //创建文件目录    创建在项目目录下的index中
        Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/index"));
        //分词处理         是一个抽象类 一种单字分词,标准的
        Analyzer analyzer=new IKAnalyzer();
        //创建IndexWriterConfig对象
        IndexWriterConfig config=new IndexWriterConfig(analyzer);
        //创建IndexWriter对象
        IndexWriter iWriter=new IndexWriter(dir, config);
        //清除之前的索引
        iWriter.deleteAll();
                //创建文档对象
        Document doc=new Document();
        //向文档中添加文本内容字段,及字段类型
        doc.add(new Field("fieldname","坚持到底gl博主的博文,转载请注释出处", TextField.TYPE_STORED));
        //将文档添加到indexWriter中,写入索引文件中
        iWriter.addDocument(doc);
                //关闭写入    
                iWriter.close();        
}
En exécutant de cette façon, vous pouvez voir que les fichiers de contenu sont dans votre. L'index a été créé. Il est sorti

L'index a été créé. Ensuite, essayez d'interroger l'index et transmettez les mots que vous devez interroger

public static void search(String string) throws Exception {
    
        Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/search"));
        //打开索引目录的
        DirectoryReader dReader=DirectoryReader.open(dir);
        IndexSearcher searcher=new IndexSearcher(dReader);
        //第一个参数 field值 ,第二个参数用户需要检索的字符串
        Term t=new Term("fieldname",string);
        //将用户需要索引的字符串封装成lucene能识别的内容 
        Query query=new TermQuery(t);
        //查询,最大的返回值10
        TopDocs top=searcher.search(query, 10);
                //命中数,那个字段命中,命中的字段有几个
        System.out.println("命中数:"+top.totalHits);
               //查询返回的doc数组
        ScoreDoc[]    sDocs= top.scoreDocs;   
            for (ScoreDoc scoreDoc : sDocs) {
                //输出命中字段内容
        System.out.println(searcher.doc(scoreDoc.doc).get(field));
}
}
Juste comme ça, un test de recherche en texte intégral est sorti. Réfléchissez davantage et résumez, étendez-le

et ajoutez un autre code pour aider à la compréhension

public static void main(String[] args) throws Exception {
        String chString="坚持到底的文章,转载请注释出处";
        Analyzer analyzer=new IKAnalyzer();
        TokenStream stream=analyzer.tokenStream("word", chString);
        stream.reset();
        CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class);
        while (stream.incrementToken()) {
            System.out.println(cta.toString());
        }
        stream.close();
    }
s'affiche comme suit :

Vous pouvez également ajouter ces quelques fichiers, une chose à noter est que vous devez faire attention à votre format d'encodage

Le premier : dictionnaire étendu ext.dic, quel mot la segmentation doit être regroupée, par exemple : le traitement de segmentation de mots peut combiner « coller jusqu'à la fin » quatre Les caractères sont divisés en « persistance » et « persistance ». Vous pouvez directement ajouter de la persévérance à la fin dans ce fichier pour afficher l'index. de persévérance

Le troisième : dictionnaire d'arrêt étendu stopword.dic, en segmentation de mots Si vous ne voulez pas qu'il apparaisse, vous ne voulez pas qu'il apparaisse séparément ou seul, vous pouvez l'écrire à l'intérieur, et il n'y aura pas de

lors de la recherche. Le deuxième : précise les deux dictionnaires étendus ci-dessus

Ce sont les contenus les plus basiques à maîtriser, et là existe de nombreux types d'algorithmes de segmentation de mots qui doivent être développés

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn