即使是不成熟的尝试,也胜于胎死腹中的策略。
elastic 索引

elastic 索引

关于Lucene merge 占用CPU高的问题

ElasticsearchPandaXu 回复了问题 • 6 人关注 • 3 个回复 • 10719 次浏览 • 2020-04-23 12:15 • 来自相关话题

关于商品不同属性不同的mapping应该如何建立

Elasticsearchliuping 回复了问题 • 5 人关注 • 4 个回复 • 3659 次浏览 • 2017-05-09 09:18 • 来自相关话题

测试的elastic1.6.0索引性能怎么比elastic5.1.1还要好

Elasticsearchancestor 回复了问题 • 3 人关注 • 1 个回复 • 4803 次浏览 • 2016-12-15 21:59 • 来自相关话题

Elasticsearch对于保持大量索引的设计和支持怎么样?

ElasticsearchXargin 回复了问题 • 7 人关注 • 3 个回复 • 4927 次浏览 • 2016-11-16 17:12 • 来自相关话题

elasticsearch新建一个新的索引慢

Elasticsearchweizijun 回复了问题 • 6 人关注 • 4 个回复 • 10853 次浏览 • 2016-09-28 12:32 • 来自相关话题

创建索引时副本(replicas)延迟复制的问题

Elasticsearchmedcl 回复了问题 • 3 人关注 • 1 个回复 • 5431 次浏览 • 2016-07-21 09:10 • 来自相关话题

Lucene5.5入门第一篇——hello World

Lucenekl 发表了文章 • 3 个评论 • 5686 次浏览 • 2016-06-24 11:00 • 来自相关话题

Lucene板块好冷清,这里将我之前的入门的博文搬过来,填不下空白,欢迎拍砖
认识Lucene

下面是百科对Lucene的描述:

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

Lucene突出的优点

Lucene作为一个全文检索引擎,其具有如下突出的优点:
(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
面对已经存在的商业全文检索引擎,Lucene也具有相当的优势。
首先,它的开发源代码发行方式(遵守Apache Software License[12]),在此基础上程序员不仅仅可以充分的利用Lucene所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面向对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上,商业软件的灵活性远远不及Lucene。
其次,Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、PDF[13]等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的达到跨平台的能力。
最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。
入门前的准备

了解一些关键字的概念:
Document   
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。 
Field  
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。  
Analyzer   
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。  
IndexWriter   
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。  
Directory   
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 
Query  
这是一个抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query。 
IndexSearcher   
IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。
Hits  
Hits 是用来保存搜索结果的。     

我的浅显理解
使用Lucene分为几个步骤,都是围绕索引展开的:
1.写索引 IndexWriter
2.读索引 IndexReader
3.查索引 IndexSearcher
4.封装查询条件,想到于写数据库的sql  QueryParser
5.查询已查到的索引得到结果集 TopDocs ,可以得到Document的一个集合  
正式入门,直接上代码                               

写索引:

package com.kl.luceneDemo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import java.io.File;
import java.io.FileReader;
import java.nio.file.Paths;
/**
 * @author kl by 2016/3/14
 * @boke www.kailing.pub
 */
public class Indexer {
    public  IndexWriter writer;
    /**
     * 实例化写索引
     */
    public Indexer(String indexDir)throws Exception{
        Analyzer analyzer=new StandardAnalyzer();//分词器
        IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer);//写索引配置
        //Directory ramDirectory= new RAMDirectory();//索引写的内存
        Directory directory= FSDirectory.open(Paths.get(indexDir));//索引存储磁盘位置
        writer=new IndexWriter(directory,writerConfig);//实例化一个写索引
    }
    /**
     * 关闭写索引
     * @throws Exception
     */
    public void close()throws Exception{
        writer.close();
    }
    /**
     * 添加指定目录的所有文件的索引
     * @param dataDir
     * @return
     * @throws Exception
     */
    public int index(String dataDir)throws Exception{
        File files=new File(dataDir).listFiles();//得到指定目录的文档数组
        for(File file:files){
            indexFile(file);
        }
        return writer.numDocs();
    }
    public void indexFile(File file)throws Exception{
        System.out.println("索引文件:"+file.getCanonicalPath());//打印索引到的文件路径信息
        Document document=getDocument(file);//得到一个文档信息,相对一个表记录
        writer.addDocument(document);//写入到索引,相当于插入一个表记录
    }

    /**
     * 返回一个文档记录
     * @param file
     * @return
     * @throws Exception
     */
    public Document getDocument(File file)throws Exception{
        Document document=new Document();//实例化一个文档
        document.add(new TextField("context",new FileReader(file)));//添加一个文档信息,相当于一个数据库表字段
        document.add(new TextField("fileName",file.getName(), Field.Store.YES));//添加文档的名字属性
        document.add(new TextField("filePath",file.getCanonicalPath(),Field.Store.YES));//添加文档的路径属性
        return document;
    }
    public static void main(String ages){
        String indexDir="E:\\LuceneIndex";
        String dataDir="E:\\LuceneTestData";
        Indexer indexer=null;
        int indexSum=0;
        try {
            indexer=new Indexer(indexDir);
            indexSum= indexer.index(dataDir);
            System.out.printf("完成"+indexSum+"个文件的索引");

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                indexer.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }

    }

}
读查索引

package com.kl.luceneDemo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;
/**
 * @author kl by 2016/3/14
 * @boke www.kailing.pub
 */
public class Searcher {
    public static void search(String indexDir,String q)throws Exception{
        Directory dir= FSDirectory.open(Paths.get(indexDir));//索引地址
        IndexReader reader= DirectoryReader.open(dir);//读索引
        IndexSearcher is=new IndexSearcher(reader);
        Analyzer analyzer=new StandardAnalyzer(); // 标准分词器
        QueryParser parser=new QueryParser("context", analyzer);//指定查询Document的某个属性
        Query query=parser.parse(q);//指定查询索引内容,对应某个分词
        TopDocs hits=is.search(query, 10);//执行搜索
        System.out.println("匹配 "+q+"查询到"+hits.totalHits+"个记录");
        for(ScoreDoc scoreDoc:hits.scoreDocs){
            Document doc=is.doc(scoreDoc.doc);
            System.out.println(doc.get("fileName"));//打印Document的fileName属性
        }
        reader.close();
    }
    public static void main(String args) {
        String indexDir="E:\\LuceneIndex";
        String q="Muir";
        try {
            search(indexDir,q);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
以下图片是我的文件目录和Lucene生成的索引文件
原文地址:http://www.kailing.pub/article/index/arcid/71.html 社区的富文本编辑器太low了,能不能换啊

ES中索引,如何将按天滚动的索引合并为一月一个索引

Elasticsearchjiaofuyou 回复了问题 • 6 人关注 • 3 个回复 • 13003 次浏览 • 2016-05-26 14:18 • 来自相关话题

ElasticSearch插件集

Elasticsearchkl 发表了文章 • 0 个评论 • 12882 次浏览 • 2016-03-30 18:07 • 来自相关话题

ElasticSearch的很多功能都是官方或第三方基于ElasticSearch的AbstractPlugin类实现的插件来提供的,所以,在里里记录下一些常用的及实用的插件地址,以备不时之需 分词插件 Combo Analysis Plugin (作者 Olivier Favre, Yakaz) 简介:组合分词器,可以把多个分词器的结果组合在一起。 Smart Chinese Analysis Plugin (作者 elasticsearch 团队) 简介:lucene默认的中文分词器 ICU Analysis plugin (作者 elasticsearch 团队) 简介:lucene自带的ICU分词,ICU是一套稳定、成熟、功能强大、轻便易用和跨平台支持Unicode 的开发包。 Stempel (Polish) Analysis plugin (作者 elasticsearch 团队) 简介:法文分词器 IK Analysis Plugin (作者 Medcl) 简介:大名鼎鼎的ik分词,都懂的! Mmseg Analysis Plugin (作者 Medcl) 简介:mmseg中文分词 Hunspell Analysis Plugin (作者 Jörg Prante) 简介:lucene自带的Hunspell模块 Japanese (Kuromoji) Analysis plugin (作者 elasticsearch 团队). 简介:日文分词器 Japanese Analysis plugin (作者 suguru). 简介:日文分词器 Russian and English Morphological Analysis Plugin (作者 Igor Motov) 简介:俄文英文分词器 Pinyin Analysis Plugin (作者 Medcl) 简介:拼音分词器 String2Integer Analysis Plugin (作者 Medcl) 简介:字符串转整型工具。主要用在facet这个功能上,如果facet的field的值是字符串的话,计算起来比较耗资源。可以把字符串映射成整型,对整型进行facet操作要比对字符串的快很多。 同步插件 CouchDB River Plugin (作者 elasticsearch 团队) 简介:CouchDB和elasticsearch的同步插件 Wikipedia River Plugin (作者 elasticsearch 团队) 简介:wikipedia文件读取插件。wikipedia是维基百科的一个离线库,不定期发布最新数据,是以xml形式发布的。这个river读取这个文件来建索引。 Twitter River Plugin (作者 elasticsearch 团队) 简介:twitter的同步插件,可以同步你twitter上的微博。 RabbitMQ River Plugin (作者 elasticsearch 团队) 简介:rabbitmq同步插件,读取rabbitmq上的队列信息并索引。 RSS River Plugin (作者 David Pilato) 简介:定期索引指定一个或多个RSS源的数据。 MongoDB River Plugin (作者 Richard Louapre) 简介:mongodb同步插件,mongodb必须搭成副本集的模式,因为这个插件的原理是通过定期读取mongodb中的oplog来同步数据。 Open Archives Initiative (OAI) River Plugin (作者 Jörg Prante) 简介:可以索引oai数据提供者提供的数据。 Sofa River Plugin (作者 adamlofts) 简介:这个插件可以把多个CouchDB的数据库同步到同一个es索引中。 JDBC River Plugin (作者 Jörg Prante) 简介:关系型数据库的同步插件 FileSystem River Plugin (作者 David Pilato) 简介:本地文件系统文件同步插件,使用方法是指定一个本地目录路径,es会定期扫描索引该目录下的文件。 LDAP River Plugin (作者 Tanguy Leroux) 简介:索引LDAP目录下的文件数据。 Dropbox River Plugin (作者 David Pilato) 简介:索引dropbox网盘上的文件。通过oauth协议来调用dropbox上的api建索引。 ActiveMQ River Plugin (作者 Dominik Dorn) 简介:activemq队列的同步插件,和之前rabbitmq的类似 Solr River Plugin (作者 Luca Cavanna) 简介:solr同步插件,可以把solr里面的索引同步到es CSV River Plugin (作者 Martin Bednar) 简介:通过指定目录地址来索引csv文件。 数据传输插件 Servlet transport (作者 elasticsearch 团队) 简介:Servlet rest插件,通过servlet来封装rest接口。 Memcached transport plugin (作者 elasticsearch 团队) 简介:本插件可以通过memcached协议进行rest接口的调用。注意:这里不是使用memcache作为es的缓存。 Thrift Transport (作者 elasticsearch 团队) 简介:使用thrift进行数据传输。 ZeroMQ transport layer plugin (作者 Tanguy Leroux) 简介:使用zeromq进rest接口的调用。 Jetty HTTP transport plugin (作者 Sonian Inc.) 简介:使用jetty来提供http rest接口。默认是使用netty。这个插件的好处是可以对http接口进行一些权限的设置。 脚本插件 Python language Plugin (作者 elasticsearch 团队) 简介:python脚本支持 JavaScript language Plugin (作者 elasticsearch 团队) 简介:javascript脚本支持 Groovy lang Plugin (作者 elasticsearch 团队) 简介:groovy脚本支持 Clojure Language Plugin (作者 Kevin Downey) 简介:clojure脚本支持 站点插件(以网页形式展现) BigDesk Plugin (作者 Lukáš Vlček) 简介:监控es状态的插件,推荐! Elasticsearch Head Plugin (作者 Ben Birch) 简介:很方便对es进行各种操作的客户端。 Paramedic Plugin (作者 Karel Minařík) 简介:es监控插件 SegmentSpy Plugin (作者 Zachary Tong) 简介:查看es索引segment状态的插件 Inquisitor Plugin (作者 Zachary Tong) 简介:这个插件主要用来调试你的查询。 其它插件 Mapper Attachments Type plugin (作者 elasticsearch 团队) 简介:附件类型插件,通过tika库把各种类型的文件格式解析成字符串。 Hadoop Plugin (作者 elasticsearch team) 简介:hadoop和elasticsearch的集成插件,可以通过hadoop的mapreduce算法来并行建立索引,同时支持cascading,hive和pig等框架。 AWS Cloud Plugin (作者 elasticsearch 团队) 简介:elasticsearch与amazon web services的集成。 ElasticSearch Mock Solr Plugin (作者 Matt Weber) 简介:elasticsearch的solr api接口。用了这个插件可以使用solr的api来调用es,直接用solrj就可以调用es。比较适用于从solr转es时暂时过度。 Suggester Plugin (作者 Alexander Reelsen) 简介:es 搜索提示功能插件,不过es0.9版本后自带了这个功能, ElasticSearch PartialUpdate Plugin (作者 Medcl) 简介:elasticsearch的部分更新插件。 ZooKeeper Discovery Plugin (作者 Sonian Inc.) 简介:通过zookeeper管理集群的插件。通过这个插件,es的分布式架构和solrcloud相似。 ElasticSearch Changes Plugin (作者 Thomas Peuss) 简介:elasticsearch索引操作记录插件。通过这个插件可以查看用户对索引的增删改操作。 ElasticSearch View Plugin (作者 Tanguy Leroux) 简介:这个插件可以把es的文档以html,xml或text的方式显示出来,它也可以通过查询生成web页面。 ElasticSearch New Relic Plugin (作者 Vinicius Carvalho) 简介:elasticsearch和newrelic的集成插件。newrelica是一个性能监控工具。这个插件会把节点的状态数据传到newrelic的账号上。 社区的编辑器好像不支持复制富文本信息,所以插件都没有链接,插件太多懒得一个个打链接了,想点地址的可以移步寒舍http://www.kailing.pub/article/index/arcid/87.html  

elasticsearch nested 会增加doc数目吗? 原理是什么

Elasticsearchhelloes 回复了问题 • 2 人关注 • 1 个回复 • 6057 次浏览 • 2016-03-18 11:42 • 来自相关话题

关于Lucene merge 占用CPU高的问题

回复

ElasticsearchPandaXu 回复了问题 • 6 人关注 • 3 个回复 • 10719 次浏览 • 2020-04-23 12:15 • 来自相关话题

关于商品不同属性不同的mapping应该如何建立

回复

Elasticsearchliuping 回复了问题 • 5 人关注 • 4 个回复 • 3659 次浏览 • 2017-05-09 09:18 • 来自相关话题

测试的elastic1.6.0索引性能怎么比elastic5.1.1还要好

回复

Elasticsearchancestor 回复了问题 • 3 人关注 • 1 个回复 • 4803 次浏览 • 2016-12-15 21:59 • 来自相关话题

Elasticsearch对于保持大量索引的设计和支持怎么样?

回复

ElasticsearchXargin 回复了问题 • 7 人关注 • 3 个回复 • 4927 次浏览 • 2016-11-16 17:12 • 来自相关话题

elasticsearch新建一个新的索引慢

回复

Elasticsearchweizijun 回复了问题 • 6 人关注 • 4 个回复 • 10853 次浏览 • 2016-09-28 12:32 • 来自相关话题

创建索引时副本(replicas)延迟复制的问题

回复

Elasticsearchmedcl 回复了问题 • 3 人关注 • 1 个回复 • 5431 次浏览 • 2016-07-21 09:10 • 来自相关话题

ES中索引,如何将按天滚动的索引合并为一月一个索引

回复

Elasticsearchjiaofuyou 回复了问题 • 6 人关注 • 3 个回复 • 13003 次浏览 • 2016-05-26 14:18 • 来自相关话题

elasticsearch nested 会增加doc数目吗? 原理是什么

回复

Elasticsearchhelloes 回复了问题 • 2 人关注 • 1 个回复 • 6057 次浏览 • 2016-03-18 11:42 • 来自相关话题

Lucene5.5入门第一篇——hello World

Lucenekl 发表了文章 • 3 个评论 • 5686 次浏览 • 2016-06-24 11:00 • 来自相关话题

Lucene板块好冷清,这里将我之前的入门的博文搬过来,填不下空白,欢迎拍砖
认识Lucene

下面是百科对Lucene的描述:

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

Lucene突出的优点

Lucene作为一个全文检索引擎,其具有如下突出的优点:
(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
面对已经存在的商业全文检索引擎,Lucene也具有相当的优势。
首先,它的开发源代码发行方式(遵守Apache Software License[12]),在此基础上程序员不仅仅可以充分的利用Lucene所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面向对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上,商业软件的灵活性远远不及Lucene。
其次,Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、PDF[13]等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的达到跨平台的能力。
最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。
入门前的准备

了解一些关键字的概念:
Document   
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。 
Field  
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。  
Analyzer   
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。  
IndexWriter   
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。  
Directory   
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 
Query  
这是一个抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query。 
IndexSearcher   
IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。
Hits  
Hits 是用来保存搜索结果的。     

我的浅显理解
使用Lucene分为几个步骤,都是围绕索引展开的:
1.写索引 IndexWriter
2.读索引 IndexReader
3.查索引 IndexSearcher
4.封装查询条件,想到于写数据库的sql  QueryParser
5.查询已查到的索引得到结果集 TopDocs ,可以得到Document的一个集合  
正式入门,直接上代码                               

写索引:

package com.kl.luceneDemo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import java.io.File;
import java.io.FileReader;
import java.nio.file.Paths;
/**
 * @author kl by 2016/3/14
 * @boke www.kailing.pub
 */
public class Indexer {
    public  IndexWriter writer;
    /**
     * 实例化写索引
     */
    public Indexer(String indexDir)throws Exception{
        Analyzer analyzer=new StandardAnalyzer();//分词器
        IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer);//写索引配置
        //Directory ramDirectory= new RAMDirectory();//索引写的内存
        Directory directory= FSDirectory.open(Paths.get(indexDir));//索引存储磁盘位置
        writer=new IndexWriter(directory,writerConfig);//实例化一个写索引
    }
    /**
     * 关闭写索引
     * @throws Exception
     */
    public void close()throws Exception{
        writer.close();
    }
    /**
     * 添加指定目录的所有文件的索引
     * @param dataDir
     * @return
     * @throws Exception
     */
    public int index(String dataDir)throws Exception{
        File files=new File(dataDir).listFiles();//得到指定目录的文档数组
        for(File file:files){
            indexFile(file);
        }
        return writer.numDocs();
    }
    public void indexFile(File file)throws Exception{
        System.out.println("索引文件:"+file.getCanonicalPath());//打印索引到的文件路径信息
        Document document=getDocument(file);//得到一个文档信息,相对一个表记录
        writer.addDocument(document);//写入到索引,相当于插入一个表记录
    }

    /**
     * 返回一个文档记录
     * @param file
     * @return
     * @throws Exception
     */
    public Document getDocument(File file)throws Exception{
        Document document=new Document();//实例化一个文档
        document.add(new TextField("context",new FileReader(file)));//添加一个文档信息,相当于一个数据库表字段
        document.add(new TextField("fileName",file.getName(), Field.Store.YES));//添加文档的名字属性
        document.add(new TextField("filePath",file.getCanonicalPath(),Field.Store.YES));//添加文档的路径属性
        return document;
    }
    public static void main(String ages){
        String indexDir="E:\\LuceneIndex";
        String dataDir="E:\\LuceneTestData";
        Indexer indexer=null;
        int indexSum=0;
        try {
            indexer=new Indexer(indexDir);
            indexSum= indexer.index(dataDir);
            System.out.printf("完成"+indexSum+"个文件的索引");

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                indexer.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }

    }

}
读查索引

package com.kl.luceneDemo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;
/**
 * @author kl by 2016/3/14
 * @boke www.kailing.pub
 */
public class Searcher {
    public static void search(String indexDir,String q)throws Exception{
        Directory dir= FSDirectory.open(Paths.get(indexDir));//索引地址
        IndexReader reader= DirectoryReader.open(dir);//读索引
        IndexSearcher is=new IndexSearcher(reader);
        Analyzer analyzer=new StandardAnalyzer(); // 标准分词器
        QueryParser parser=new QueryParser("context", analyzer);//指定查询Document的某个属性
        Query query=parser.parse(q);//指定查询索引内容,对应某个分词
        TopDocs hits=is.search(query, 10);//执行搜索
        System.out.println("匹配 "+q+"查询到"+hits.totalHits+"个记录");
        for(ScoreDoc scoreDoc:hits.scoreDocs){
            Document doc=is.doc(scoreDoc.doc);
            System.out.println(doc.get("fileName"));//打印Document的fileName属性
        }
        reader.close();
    }
    public static void main(String args) {
        String indexDir="E:\\LuceneIndex";
        String q="Muir";
        try {
            search(indexDir,q);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
以下图片是我的文件目录和Lucene生成的索引文件
原文地址:http://www.kailing.pub/article/index/arcid/71.html 社区的富文本编辑器太low了,能不能换啊

ElasticSearch插件集

Elasticsearchkl 发表了文章 • 0 个评论 • 12882 次浏览 • 2016-03-30 18:07 • 来自相关话题

ElasticSearch的很多功能都是官方或第三方基于ElasticSearch的AbstractPlugin类实现的插件来提供的,所以,在里里记录下一些常用的及实用的插件地址,以备不时之需 分词插件 Combo Analysis Plugin (作者 Olivier Favre, Yakaz) 简介:组合分词器,可以把多个分词器的结果组合在一起。 Smart Chinese Analysis Plugin (作者 elasticsearch 团队) 简介:lucene默认的中文分词器 ICU Analysis plugin (作者 elasticsearch 团队) 简介:lucene自带的ICU分词,ICU是一套稳定、成熟、功能强大、轻便易用和跨平台支持Unicode 的开发包。 Stempel (Polish) Analysis plugin (作者 elasticsearch 团队) 简介:法文分词器 IK Analysis Plugin (作者 Medcl) 简介:大名鼎鼎的ik分词,都懂的! Mmseg Analysis Plugin (作者 Medcl) 简介:mmseg中文分词 Hunspell Analysis Plugin (作者 Jörg Prante) 简介:lucene自带的Hunspell模块 Japanese (Kuromoji) Analysis plugin (作者 elasticsearch 团队). 简介:日文分词器 Japanese Analysis plugin (作者 suguru). 简介:日文分词器 Russian and English Morphological Analysis Plugin (作者 Igor Motov) 简介:俄文英文分词器 Pinyin Analysis Plugin (作者 Medcl) 简介:拼音分词器 String2Integer Analysis Plugin (作者 Medcl) 简介:字符串转整型工具。主要用在facet这个功能上,如果facet的field的值是字符串的话,计算起来比较耗资源。可以把字符串映射成整型,对整型进行facet操作要比对字符串的快很多。 同步插件 CouchDB River Plugin (作者 elasticsearch 团队) 简介:CouchDB和elasticsearch的同步插件 Wikipedia River Plugin (作者 elasticsearch 团队) 简介:wikipedia文件读取插件。wikipedia是维基百科的一个离线库,不定期发布最新数据,是以xml形式发布的。这个river读取这个文件来建索引。 Twitter River Plugin (作者 elasticsearch 团队) 简介:twitter的同步插件,可以同步你twitter上的微博。 RabbitMQ River Plugin (作者 elasticsearch 团队) 简介:rabbitmq同步插件,读取rabbitmq上的队列信息并索引。 RSS River Plugin (作者 David Pilato) 简介:定期索引指定一个或多个RSS源的数据。 MongoDB River Plugin (作者 Richard Louapre) 简介:mongodb同步插件,mongodb必须搭成副本集的模式,因为这个插件的原理是通过定期读取mongodb中的oplog来同步数据。 Open Archives Initiative (OAI) River Plugin (作者 Jörg Prante) 简介:可以索引oai数据提供者提供的数据。 Sofa River Plugin (作者 adamlofts) 简介:这个插件可以把多个CouchDB的数据库同步到同一个es索引中。 JDBC River Plugin (作者 Jörg Prante) 简介:关系型数据库的同步插件 FileSystem River Plugin (作者 David Pilato) 简介:本地文件系统文件同步插件,使用方法是指定一个本地目录路径,es会定期扫描索引该目录下的文件。 LDAP River Plugin (作者 Tanguy Leroux) 简介:索引LDAP目录下的文件数据。 Dropbox River Plugin (作者 David Pilato) 简介:索引dropbox网盘上的文件。通过oauth协议来调用dropbox上的api建索引。 ActiveMQ River Plugin (作者 Dominik Dorn) 简介:activemq队列的同步插件,和之前rabbitmq的类似 Solr River Plugin (作者 Luca Cavanna) 简介:solr同步插件,可以把solr里面的索引同步到es CSV River Plugin (作者 Martin Bednar) 简介:通过指定目录地址来索引csv文件。 数据传输插件 Servlet transport (作者 elasticsearch 团队) 简介:Servlet rest插件,通过servlet来封装rest接口。 Memcached transport plugin (作者 elasticsearch 团队) 简介:本插件可以通过memcached协议进行rest接口的调用。注意:这里不是使用memcache作为es的缓存。 Thrift Transport (作者 elasticsearch 团队) 简介:使用thrift进行数据传输。 ZeroMQ transport layer plugin (作者 Tanguy Leroux) 简介:使用zeromq进rest接口的调用。 Jetty HTTP transport plugin (作者 Sonian Inc.) 简介:使用jetty来提供http rest接口。默认是使用netty。这个插件的好处是可以对http接口进行一些权限的设置。 脚本插件 Python language Plugin (作者 elasticsearch 团队) 简介:python脚本支持 JavaScript language Plugin (作者 elasticsearch 团队) 简介:javascript脚本支持 Groovy lang Plugin (作者 elasticsearch 团队) 简介:groovy脚本支持 Clojure Language Plugin (作者 Kevin Downey) 简介:clojure脚本支持 站点插件(以网页形式展现) BigDesk Plugin (作者 Lukáš Vlček) 简介:监控es状态的插件,推荐! Elasticsearch Head Plugin (作者 Ben Birch) 简介:很方便对es进行各种操作的客户端。 Paramedic Plugin (作者 Karel Minařík) 简介:es监控插件 SegmentSpy Plugin (作者 Zachary Tong) 简介:查看es索引segment状态的插件 Inquisitor Plugin (作者 Zachary Tong) 简介:这个插件主要用来调试你的查询。 其它插件 Mapper Attachments Type plugin (作者 elasticsearch 团队) 简介:附件类型插件,通过tika库把各种类型的文件格式解析成字符串。 Hadoop Plugin (作者 elasticsearch team) 简介:hadoop和elasticsearch的集成插件,可以通过hadoop的mapreduce算法来并行建立索引,同时支持cascading,hive和pig等框架。 AWS Cloud Plugin (作者 elasticsearch 团队) 简介:elasticsearch与amazon web services的集成。 ElasticSearch Mock Solr Plugin (作者 Matt Weber) 简介:elasticsearch的solr api接口。用了这个插件可以使用solr的api来调用es,直接用solrj就可以调用es。比较适用于从solr转es时暂时过度。 Suggester Plugin (作者 Alexander Reelsen) 简介:es 搜索提示功能插件,不过es0.9版本后自带了这个功能, ElasticSearch PartialUpdate Plugin (作者 Medcl) 简介:elasticsearch的部分更新插件。 ZooKeeper Discovery Plugin (作者 Sonian Inc.) 简介:通过zookeeper管理集群的插件。通过这个插件,es的分布式架构和solrcloud相似。 ElasticSearch Changes Plugin (作者 Thomas Peuss) 简介:elasticsearch索引操作记录插件。通过这个插件可以查看用户对索引的增删改操作。 ElasticSearch View Plugin (作者 Tanguy Leroux) 简介:这个插件可以把es的文档以html,xml或text的方式显示出来,它也可以通过查询生成web页面。 ElasticSearch New Relic Plugin (作者 Vinicius Carvalho) 简介:elasticsearch和newrelic的集成插件。newrelica是一个性能监控工具。这个插件会把节点的状态数据传到newrelic的账号上。 社区的编辑器好像不支持复制富文本信息,所以插件都没有链接,插件太多懒得一个个打链接了,想点地址的可以移步寒舍http://www.kailing.pub/article/index/arcid/87.html