美文网首页
04_Lucene域

04_Lucene域

作者: 对方不想理你并向你抛出一个异常 | 来源:发表于2018-01-07 21:46 被阅读0次

域的详细介绍

是否分词:

  分词的作用是为了索引
  需要分词: 文件名称, 文件内容
  不需要分词: 不需要索引的域不需要分词,还有就是分词后无意义的域不需要分词
    比如: id, 身份证号

是否索引:

  索引的的目的是为了搜索.
  需要搜索的域就一定要创建索引,只有创建了索引才能被搜索出来
  不需要搜索的域可以不创建索引
  需要索引: 文件名称, 文件内容, id, 身份证号等
  不需要索引: 比如图片地址不需要创建索引, e:\xxx.jpg
    因为根据图片地址搜索无意义

是否存储:

  存储的目的是为了显示.
  是否存储看个人需要,存储就是将内容放入Document文档对象中保存出来,会额外占用磁盘空间, 如果搜索的时候需要马上显示出来可以放入document中也就是要存储,这样查询显示速度快, 如果不是马上立刻需要显示出来,则不需要存储,因为额外占用磁盘空间不划算.

域的各种类型

Field类 数据类型 Analyzed是否分析 Indexed是否索引 Stored是否存储 说明
StringField(FieldName, FieldValue,Store.YES)) 字符串 N Y Y或N 这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等)是否存储在文档中用Store.YES或Store.NO决定
LongField(FieldName, FieldValue,Store.YES) Long型 Y Y Y或N 这个Field用来构建一Long数字型Field,进行分析和索引,比如(价格)是否存储在文档中用Store.YES或Store.NO决定
StoredField(FieldName, FieldValue) 重载方法,支持多种类型 N N Y 这个Field用来构建不同类型Field 不分析,不索引,但要Field存储在文档中
TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader) 字符串或流 Y Y Y或N 如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略.

注意:lucene底层的算法,钱数是要分词的,因为要根据价钱进行对比
例如: 大于12.5元的小于100元的商品搜索出来

  • 将前面建立索引的代码重新修改
package cn.huahcao.lucene;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class IndexManagerTest {
    @Test
    public void testCreateIndex() throws Exception{
        //采集文件系统中的文档数据,放入lucene中
        //文档列表,保存Document
        List<Document> docList = new ArrayList<Document>();

        //指定文件所在的目录
        File dir = new File("G:\\Java\\JavaEE\\09_SSM\\lucene_day01\\参考资料\\searchsource");

        //循环取出文件
        for (File file:dir.listFiles()){
            //文件名称
            String fileName = file.getName();
            //文件内容
            String fileContext = FileUtils.readFileToString(file);
            //文件大小
            Long fileSize = FileUtils.sizeOf(file);
            //文档对象。文件系统中的一个文件就是一个Document对象
            Document doc = new Document();
            /**
             * 第一个参数:域名
             * 第二个参数:域值
             * 第三个参数:是否存储,是为Yes,不存储为No
             */
//            TextField nameFiled = new TextField("fileName",fileName, Field.Store.YES);
//            TextField contextFiled = new TextField("fileContent",fileContent, Field.Store.YES);
//            TextField sizeFiled = new TextField("fileSize",fileSize.toString(), Field.Store.YES);

            //是否分词:要,因为它要索引,并且它不是一个整体,分词有意义
            //是否索引:要,因为要通过它来进行搜索
            //是否存储:要,因为要直接在页面上显示
            TextField nameFiled = new TextField("fileName", fileName, Field.Store.YES);

            //是否分词: 要,因为要根据内容进行搜索,并且它分词有意义
            //是否索引: 要,因为要根据它进行搜索
            //是否存储: 可以要也可以不要,不存储搜索完内容就提取不出来
            TextField contextFiled = new TextField("fileContext", fileContext, Field.Store.NO);

            //是否分词: 要, 因为数字要对比,搜索文档的时候可以搜大小, lunene内部对数字进行了分词算法
            //是否索引: 要, 因为要根据大小进行搜索
            //是否存储: 要, 因为要显示文档大小
            LongField sizeFiled = new LongField("fileSize", fileSize, Field.Store.YES);

            //将所有的域存入文档中
            doc.add(nameFiled);
            doc.add(contextFiled);
            doc.add(sizeFiled);

            //将文档存入文档集合中
            docList.add(doc);
        }

        //创建分词器,StandardAnalyzer标准分词器,标准分词器对英文分词效果很好,对中文是单字分词
        StandardAnalyzer analyzer = new StandardAnalyzer();
        //指定索引和文档存储的目录
        FSDirectory directory = FSDirectory.open(new File("G:\\Java\\JavaEE\\09_SSM\\lucene_day01\\tmp"));
        //创建写对象的初始化对象
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
        //创建索引和文档写对象
        IndexWriter indexWriter = new IndexWriter(directory , config);

        //将文档加入到索引和文档的写对象中
        for (Document doc:docList){
            indexWriter.addDocument(doc);
        }
        //提交
        indexWriter.commit();
        //关闭流
        indexWriter.close();
    }

}

运行上面代码重新建立索引

  • 使用luke查看如下:


  • 查看Document


    因为我们没有存储文件内容,所以fileContext是空的

相关文章

  • 04_Lucene域

    域的详细介绍 是否分词:   分词的作用是为了索引  需要分词: 文件名称, 文件内容  不需要分词: 不需要索引...

  • O域、B域、M域是指什么

    O域(运营域)、B域(业务域)、M域(管理域)特指电信行业大数据领域的三大数据域: B域(业务域)= busine...

  • 测试markdown

    # 云域 ##云域 ###云域 ####云域

  • js作用域

    1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 1.3 局部作用域 ...

  • 作用域,作用域链

    1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 1.3 局部作用域 ...

  • 变量作用域

    变量作用域:静态作用域、动态作用域JS变量作用域:JS使用静态作用域JS没有块级作用域(全局作用域、函数作用域等)...

  • 一网打尽 JavaScript 的作用域

    JavaScript 的作用域包括:模块作用域,函数作用域,块作用域,词法作用域和全局作用域。 全局作用域 在任何...

  • 跨域

    1、跨域是什么 域指的是域名,向一个域发送请求,如果请求的域和当前域是不同域,就叫跨域;不同域之间的请求就叫跨域请...

  • 作用域

    词法作用域,动态作用域,全局作用域,局部作用域,函数作用域,块级作用域,有些地方还能看到隐式作用域和显示作用域。 ...

  • JS的作用域

    JS的作用域: 全局作用域、函数作用域、eval 作用域、块级作用域 全局作用域: 函数作用域: 结果截屏: 说...

网友评论

      本文标题:04_Lucene域

      本文链接:https://www.haomeiwen.com/subject/mlimnxtx.html