Lucene教程(三) 索引域选项

通过上两篇的学习,想必已经入了门了,今天来看索引域选项中的几个值得设置

先来看一个构造器:

  /**
   * Create a field by specifying its name, value and how it will
   * be saved in the index. Term vectors will not be stored in the index.
   *
   * @param name The name of the field
   * @param value The string to process
   * @param store Whether <code>value</code> should be stored in the index
   * @param index Whether the field should be indexed, and if so, if it should
   *  be tokenized before indexing
   * @throws NullPointerException if name or value is <code>null</code>
   * @throws IllegalArgumentException if the field is neither stored nor indexed
   */
  public Field(String name, String value, Store store, Index index) {
    this(name, value, store, index, TermVector.NO);
  }

我们向Document添加Field可以有更多的设置,那么都是什么意思呢?

name:字段名,很容易理解

value:字段值,也很容易理解

store和index怎么解释,下面就来看一下这两个选项的可选值:

Field.Store.YES或者NO(存储域选项)

设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原

设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原

Field.Index(索引选项)

Index.ANALYZED:进行分词和索引,适用于标题、内容等

Index.NOT_ANALYZED:进行索引,但是不进行分词,如果身份证号,姓名,ID等,适用于精确搜索

Index.ANALYZED_NOT_NORMS:进行分词但是不存储norms信息,这个norms中包括了创建索引的时间和权值等信息

Index.NOT_ANALYZED_NOT_NORMS:即不进行分词也不存储norms信息

Index.NO:不进行索引

写个例子看看,由于pom文件与之前的一样,就不贴出了,直接看例子代码:

3.5版本:

package com.darren.lucene35;

import java.io.File;

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.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.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 org.apache.lucene.util.Version;

public class IndexUtil {
    private static final String[] ids = { "1", "2", "3" };
    private static final String[] authors = { "Darren", "Tony", "Grylls" };
    private static final String[] titles = { "Hello World", "Hello Lucene", "Hello Java" };
    private static final String[] contents = { "Hello World, I am on my way", "Today is my first day to study Lucene",
            "I like Java" };

    /**
     * 建立索引
     */
    public static void index() {
        IndexWriter indexWriter = null;
        try {
            // 1、创建Directory
            Directory directory = FSDirectory.open(new File("F:/test/lucene/index"));

            // 2、创建IndexWriter
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
            IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer);
            indexWriter = new IndexWriter(directory, config);

            int size = ids.length;
            for (int i = 0; i < size; i++) {
                // 3、创建Document对象
                Document document = new Document();
                // 看看四个参数的意思
                /**
                 * Create a field by specifying its name, value and how it will be saved in the index. Term vectors will
                 * not be stored in the index.
                 *
                 * @param name
                 *            The name of the field
                 * @param value
                 *            The string to process
                 * @param store
                 *            Whether <code>value</code> should be stored in the index
                 * @param index
                 *            Whether the field should be indexed, and if so, if it should be tokenized before indexing
                 *
                 *            public Field(String name, String value, Store store, Index index) { this(name, value,
                 *            store, index, TermVector.NO); }
                 */

                // 4、为Document添加Field

                // 对ID存储,但是不分词也不存储norms信息,这个norms中包括了创建索引的时间和权值等信息
                document.add(new Field("id", ids[i], Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
                // 对Author存储,但是不分词也不存储norms信息,这个norms中包括了创建索引的时间和权值等信息
                document.add(new Field("author", authors[i], Field.Store.YES, Field.Index.NOT_ANALYZED));
                // 对Title存储,分词
                document.add(new Field("title", titles[i], Field.Store.YES, Field.Index.ANALYZED));
                // 对Content不存储,但是分词
                /**
                 * 注:添加内容或文件是默认是不存储的,这个查询时可以证明这个问题
                 *
                 * new Field(name, reader)
                 *
                 * 那么问题来了,如果想存文件内容怎么办呢?
                 *
                 * 那就把文件读出来,比如读出字符串,然后不就能按字符串的方式存储啦
                 */
                document.add(new Field("content", contents[i], Field.Store.NO, Field.Index.ANALYZED));

                // 5、通过IndexWriter添加文档到索引中
                indexWriter.addDocument(document);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (indexWriter != null) {
                    indexWriter.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 搜索
     */
    public static void search() {
        IndexReader indexReader = null;
        try {
            // 1、创建Directory
            Directory directory = FSDirectory.open(new File("F:/test/lucene/index"));
            // 2、创建IndexReader
            indexReader = IndexReader.open(directory);
            // 3、根据IndexReader创建IndexSearch
            IndexSearcher indexSearcher = new IndexSearcher(indexReader);
            // 4、创建搜索的Query
            // 使用默认的标准分词器
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);

            // 在content中搜索Lucene
            // 创建parser来确定要搜索文件的内容,第二个参数为搜索的域
            QueryParser queryParser = new QueryParser(Version.LUCENE_35, "content", analyzer);
            // 创建Query表示搜索域为content包含Lucene的文档
            Query query = queryParser.parse("Lucene");

            // 5、根据searcher搜索并且返回TopDocs
            TopDocs topDocs = indexSearcher.search(query, 10);
            // 6、根据TopDocs获取ScoreDoc对象
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            for (ScoreDoc scoreDoc : scoreDocs) {
                // 7、根据searcher和ScoreDoc对象获取具体的Document对象
                Document document = indexSearcher.doc(scoreDoc.doc);
                // 8、根据Document对象获取需要的值
                System.out.println("id : " + document.get("id"));
                System.out.println("author : " + document.get("author"));
                System.out.println("title : " + document.get("title"));
                /**
                 * 看看content能不能打印出来,为什么?
                 */
                System.out.println("content : " + document.get("content"));
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (indexReader != null) {
                    indexReader.clone();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

我在注释中留了问题,现在我们是这样添加content字段的:

document.add(new Field("content", contents[i], Field.Store.NO, Field.Index.ANALYZED));

测试代码如下:

package com.darren.lucene35;

import org.junit.Test;

public class IndexUtilTest {
    @Test
    public void testIndex() {
        IndexUtil.index();
    }

    @Test
    public void testSearch() {
        IndexUtil.search();
    }
}

现在跑一下测试看看效果,结果如下:

id : 2
author : Tony
title : Hello Lucene
content : null

为什么content为null,就是因为没有存,那么我们存一下看看

document.add(new Field("content", contents[i], Field.Store.YES, Field.Index.ANALYZED));

再跑一下测试,注意,要先跑索引,再跑查询

id : 2
author : Tony
title : Hello Lucene
content : Today is my first day to study Lucene

现在content有值了

索引选项与此类同,不在赘述

4.5版本:

5.0版本:

稍后更新4.5版本和5.0版本

时间: 2024-10-09 15:17:49

Lucene教程(三) 索引域选项的相关文章

Lucene教程(四) 索引的更新和删除

这篇文章是基于上一篇文章来写的,使用的是IndexUtil类,下面的例子不在贴出整个类的内容,只贴出具体的方法内容. 3.5版本: 先写了一个check()方法来查看索引文件的变化: /** * 检查一下索引文件 */ public static void check() { IndexReader indexReader = null; try { Directory directory = FSDirectory.open(new File("F:/test/lucene/index&quo

Lucene——Field.Store(存储域选项)及Field.Index(索引选项)

Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原(doc.get) Field.Index(索引选项) Index.ANALYZED:进行分词和索引,适用于标题.内容等 Index.NOT_ANALYZED:进行索引,但是不进行分词,如果身份证号.姓名.ID等,适用于精确搜索 Index.ANALYZED_NOT_NORMS:进行分词但是不

Elasticsearch入门教程(三):Elasticsearch索引&amp;映射

原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79213163 索引概念简介 通常说的索引有两种词性,名称和动词. 动词索引indexing,索引一个文档,表示把一个文档存储到索引Index里,可以用来查询和检索,es采用倒排索引 名词索引index,

Lucene中的域选项

Field类是lucene在索引过程中的一个很重要的类,该类控制着域值被索引的方式 域选项主要包括以下几种选项:域索引选项.域存储选项.域的项向量选项.域的排序选项等 域索引选项:通过倒排索引来控制域值是否能够被搜索                Index.ANALYZED,将文本域分析成为一个或多个独立的语汇单元,每个语汇单元都能够被搜索 Index.NOT_ANALYZED,对文本域进行索引但是不进行分词(适用于对人名,URL,电话号码等需要进行精确匹配的搜索) Index.ANALYZE

Lucene教程具体解释

注明:本文是由本人在开发有关基于lucene资源检索系统时的一点总结,当中一部分是自己依据开发过程自己总结的,也有部分是摘自网络,因无法获取当时摘文的地址,所以在此没有写源地址. 转载请声明出处 Lucene-3.0.0配置 一.Lucene开发环境配置 step1.Lucene开发包下载 step2.Java开发环境配置 step3.Tomcat安装 step4.Lucene开发环境配置 解压下载的lucene-3.0.0.zip,能够看到lucene-core-3.0.0.jar和lucen

Lucene教程(转)

Lucene教程 1 lucene简介1.1 什么是lucene    Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品.2 lucene的工作方式    lucene提供的服务实际包含两部分:一入一出.所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除:所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源.2.1写入流程    源字符

eclipse中新建Java工程的三个JRE选项区别

转载:http://blog.csdn.net/wdjhzw/article/details/42086615 本文的主角就是这个十分令人纠结地方,至少令我这个初学者十分纠结… 先来看看官方的解释(链接) Use default JRE: When selected, the New Java Project Wizard creates a new Java project which uses the workspace default JRE. The default JRE can be

Lucene之删除索引

分类: [java]2013-08-30 22:22 467人阅读 评论(0) 收藏 举报 1.前言 之前的博客<Lucene全文检索之HelloWorld>已经简单介绍了Lucene的索引生成和检索.本文着重介绍Lucene的索引删除. 2.应用场景: 索引建立完成后,因为有些原因,被索引的文件已经删除.此时,索引仍然存在,为了不产生“虚假检索结果”,需要将失效的索引删除 3.HelloLucene类(重点关注deleteIndexByQuery方法) [java] view plainco

Lucene 4.9索引txt文件

暂时只是跑起来了,不知道是否正确,困了,睡觉了,改天再弄.搜索那块是分页的,也没仔细弄... 参考着 http://blog.csdn.net/kingskyleader/article/details/8444739 在data下放了三个txt... S:\lucene\data\永生.txt S:\lucene\data\1.txt S:\lucene\data\2.txt 永生是本小说,汉语的应该没有英文. 1.txt 内容: hello 2.txt 内容: hi hello  哈哈 程序