Solr学习整理(Luncene原理)

  由于各种原因大概很长时间都要折腾solr了,既来之则安之,花了好多精力折腾的项目怎么能不好好整理学习一下,深入理解一下solr的原理。目前接触到的搜索相关的几乎就是solr和elasticsearch平分天下,而这两者由都是基于luncene开发的全文检索系统,elasticsearch暂时还没有接触,暂时被solr虐的死去活来。

  什么是luncene? Luncene是java开发的信息检索类库,专注于文本的搜索和索引,对文本中提取出来的数据进行索引和检索,也就是说luncene提供了全文检索的两个核心功能,索引和检索,而其他的则需要用户自己实现,如solr和elasticsearch就是各自基于luncene的实现。

  Luncene的索引是什么? Lunecen的索引本质上是一种倒排索引,倒排索引的功能是快速的返回要查找的单词包含在哪些文档中。

  luncene的索引过程?索引的基本单位是文档,一个文档可以包含多个域,域值可以被索引也可以被单独存值,Luncene的索引过程就是从原始的文本中提取数据,并创建对应的document实例,一个document中包含了多个域,域是用来保存原始数据,然后分析过程将域处理成语汇单元添加到段文件中,核心过程可以总结成为,提取文档,分析文档,添加文档三个过程。提取文档过程,从各种文本中提取数据,对应的程序指的就是封装document的过程,分析文档,将要索引的数据封装成一个个的document对象之后会交给luncene来分析,分析过程会将数据分割成一个个的语汇单元,并做一些处理,比如对数据进行大小写转换,去除一些停词,无意义的词,最后生成语汇单元,最后对生成语汇单元写入到索引文件中。

  来写一个对本地文件夹所有文件建索引的程序,对F盘下的所有文件的文件名建索引,生成的索引存放在F:\\Lucence\\Fdiskindex 目录下

  添加pom依赖

  

 <lucene.version>4.6.1</lucene.version>  

<dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>${lucene.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>${lucene.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>${lucene.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-highlighter -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-highlighter</artifactId>
            <version>${lucene.version}</version>
        </dependency>

f盘文件建索引

public class DiskIndex {

    private static Logger logger = Logger.getLogger(DiskIndex.class);

    private String IndexOutputStr;

    private String indexRootPath;

    public String getIndexOutputStr() {
        return IndexOutputStr;
    }

    public void setIndexOutputStr(String indexOutputStr) {
        IndexOutputStr = indexOutputStr;
    }

    public String getIndexRootPath() {
        return indexRootPath;
    }

    public void setIndexRootPath(String indexRootPath) {
        this.indexRootPath = indexRootPath;
    }

    private IndexWriter iwriter;

    public void index() {
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer);
        try {
            Directory directory = FSDirectory.open(new File(IndexOutputStr));
            iwriter = new IndexWriter(directory, config);
            File inputfile = new File(indexRootPath);
            File[] files = inputfile.listFiles();
            for (File file : files) {
                if(fileFilter(file)) {
                    addDoc(file);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
            logger.warn("打开文件异常");
        }
    }

    private void addDoc(File file) {
        if (file.isDirectory()&&(!file.getPath().contains("RECYCLE.BIN"))) {
            try{
            File[]  filelist = file.listFiles();
            for ( File afile: filelist ) {
            addDoc(afile);
            } }catch (Exception E){

            }

        } else if (file.isFile()&&(!file.getPath().contains("RECYCLE.BIN"))) {
            try {
                indexFile(file);
            } catch (IOException e) {
                logger.info("索引文件出错 path = " + file.getPath());
            }
        }
    }

    private void close() throws IOException {
        iwriter.close();
    }

    private void indexFile(File file) throws IOException {
        logger.info(" index file = "+ file.getPath());
        String fileName = file.getName();
        String filePath = file.getPath();
        Long fileSize = file.length();
        Document doc = new Document();
        doc.add(new Field("filename", fileName, TextField.TYPE_STORED));
        doc.add(new Field("filepath", filePath, TextField.TYPE_STORED));
        doc.add(new LongField("fileSize", fileSize, LongField.TYPE_STORED));
        iwriter.addDocument(doc);

    }

    public static  boolean fileFilter(File file){
        Boolean  flag = true;
        if(file.getPath().contains("spark")){
            flag = false;
        }
        if(file.getPath().contains("hive")){
            flag = false;
        }
        return flag;
    }
     public static void main(String[] args) throws IOException {
        DiskIndex index = new DiskIndex();
        index.setIndexRootPath("F:\\");
        index.setIndexOutputStr("F:\\Lucence\\Fdiskindex");
        index.index();
        index.close();
     }

}

再来一个搜索程序,搜索F盘下和redis有关的文件

public class DiskSearch {

    private Logger logger = Logger.getLogger(DiskIndex.class);

    private DirectoryReader ireader = null;

    private IndexSearcher isearcher = null;

    private String indexdir = "F:\\Lucence\\Fdiskindex";

    public void search(String queryField) {

        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);
        QueryParser parser = new QueryParser(Version.LUCENE_46, "filename", analyzer);
        Directory directory = null;
        try {
            directory = FSDirectory.open(new File(indexdir));
            DirectoryReader ireader = DirectoryReader.open(directory);
            IndexSearcher isearcher = new IndexSearcher(ireader);

            Query query = parser.parse(queryField);//query  word
            ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
            for (int i = 0; i < hits.length; i++) {
                Document hitDoc = isearcher.doc(hits[i].doc);
                System.out.println("____________________________");
                System.out.println(hitDoc.get("filename"));
                System.out.println(hitDoc.get("filepath"));
            }
            ireader.close();
            directory.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        DiskSearch  search = new DiskSearch();
        search.search("redis");
    }

}

查看返回结果

  

时间: 2024-10-19 10:42:44

Solr学习整理(Luncene原理)的相关文章

Spring?IOC设计原理解析:本文乃学习整理参考而来

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

js数组学习整理

原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); //长度为3 var colors = new Array('red','blue');//初始化 其中,在声明数组的时候,去掉new操作符,也可以. 还有一种初始化数组的方式,使用数组字面量表示法 . 数组字面量由一对包含数组项的方括号表示,多个数组项之间用逗号隔开. var colors = [ '

ijwmh1-2-以前学习整理出来的学习内容--什么是变量1整型变量

崧闱旭 ijwmh1-2-以前学习整理出来的学习内容--什么是变量1整型变量

java中反射学习整理

转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力. java中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装载,无须在组件之间进行链接.反射允许在编写与执行时,使程序能够接入到jvm中的类的内部信息,而不是源代码中选定的类协作的代码.这使反射成为构建灵活应用代码的主要工具.需要注意的是,如果使用不当,反射的成本会很高. package

AJAX学习整理二之简单实例

做了几个简单的实例,加载txt文本内容.加载xml文件内容,把xml文本内容转换成html表格显示.废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <head>     <title>通过ajax获取文本内容</title>     <meta charset="utf-8">     <scr

java密码学学习整理--对称加密(着重描述3des)

1.对称加密要点 对称加密算法的核心是加密和解密操作使用同一套密钥.加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要.因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题. 2.des(参考自:http://baike.baidu.com/view/878529.htm?from_id=210508&type=syn&fromtitle=DES&fr=aladdin) DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的

2017年 1月 15日 指针 学习整理

有关指针的概念: 指针是一个特殊的变量,它里面存储的数值被解释为内存里的一个地址. FIrst of all:我们需要明确目标 关于指针的学习以及使用我们需要搞清楚有关指针的四个内容:指针的类型,指针所指向的类型,指针的值(或者说叫指针所指向的内存区),还有指针本身所占用的内存区(指针也是一个特殊的变量吗,它肯定也是占据内存的).接下来让我们分别进行学习. 我们先来申明几个指针的例子: 1 int *ptr; 2 char *ptr; 3 int **ptr; 4 int (*ptr)[3];

TweenMax学习整理--特有属性

TweenMax学习整理--特有属性 构造函数:TweenMax(target:Object, duration:Number, vars:Object) target:Object -- 需要缓动的对象 duration:Number -- 缓动持续时间 vars:Object -- 其它参数(特有属性29个,插件17个,公共属性10个,公共方法20个) TweenMax提供的方法大多都会返回一个TweenMax Object实例 [特有属性(29个)] 这29个参数可以直接传入第三个obje

linux学习 整理(1)

ls目录文件 uname 现实当前系统信息 clear 清理 history 历史记录 ctrl + R 搜索历史记录 ESC按完之后按. 补齐上次参数 切换root用户 su - 使用管理员权限运行命令 sudo 现实当前用户信息 id 修改当前用户密码 passwd 命令 + & 在后台运行进程 jobs查看后台作业 ctrl + Z 暂停某个程序 bg 控制进程继续在后台运行 fg 控制进程在前台运行 ctrl + C 结束当前命令 linux学习 整理(1),布布扣,bubuko.com