Lucene(一)——基础

1、倒排索引

根据词条查询文档。
名词概念:
◦文档(Document):索引库中的每一条原始数据。
◦词条(Term):原始数据按照算法进行分词,得到的每一个词语。
◦文档列表:Lucene 对原始文档进行编号(DocID),形成的列表就是文档列表。
倒排索引建立过程:
1、创建文档列表:Lucene 首先对原始文档数据进行编号(DocId),形成文档列表


Lucene(一)——基础_第1张图片
Paste_Image.png

2、创建倒排索引列表:
对文档中数据进行分词,得到 词条(Term)。对词条添加编号并创建索引,并在词条中记录包含该词条的所有文档编号及其他信息。


Lucene(一)——基础_第2张图片
Paste_Image.png

3搜索过程:
.获得用户搜索内容,对搜索内容进行分词,得到用户搜索的所有词条。
.将词条在倒排索引列表中进行匹配,得到包含该词条的所有文档编号。

Lucene 全文检索就是对文档中全部内容进行分词,然后对所有单词建立倒排索引的过程。

2、lucene基础

概念

Lucene(一)——基础_第3张图片
Paste_Image.png

Lucene(一)——基础_第4张图片
Lucene创建索引流程图

流程说明:
创建文档对象(Document),并添加索引Field字段(Field)
创建目录对象(Directory)并指定索引在硬盘中存储位置
创建分词器对象(Analyzer)
创建索引写出器配置对象(IndexWriterConfig)(指定Analyzer和Version等)
创建索引写出器(IndexWriter)
索引写出器,添加文档对象
提交并关闭索引写出器

代码简单示例:

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.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

public class PhraseQueryTest {

    public static void main(String[] args) throws Exception {
        //在内存中建立索引
        Directory directory = new RAMDirectory();
        createIndex(directory);
        queryIndex(directory);
    }

    private static Document createDocument(String id, String content) {
        Document doc = new Document();
        doc.add(new Field("id", id, StringField.TYPE_STORED));
        doc.add(new Field("contents", content, TextField.TYPE_STORED));
        return doc;
    }
    
    private static void createIndex(Directory directory) throws Exception {
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_48);//分词器
        IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_48,analyzer);
        IndexWriter writer = new IndexWriter(directory, iwc);
        // 索引一些文档
        writer.addDocument(createDocument("1", "foo bar baz"));
        writer.addDocument(createDocument("2", "red green blue"));
        writer.addDocument(createDocument("3", "test foo bar test"));
        writer.close();
    }

    private static void queryIndex(Directory directory) throws Exception {
        // 查找包含"foo bar"这个短语的文档
        String inputStr = "foo bar";
        IndexReader reader = DirectoryReader.open(directory);

        // 根据IndexReader创建IndexSearcher
        IndexSearcher searcher = new IndexSearcher(reader);
        PhraseQuery query = new PhraseQuery();
        String[] words = inputStr.split(" ");
        for (String word : words) {
            query.add(new Term("contents", word));
        }

        // 显示搜索结果
        TopDocs topDocs = searcher.search(query, 10);
        for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
            Document doc = searcher.doc(scoreDoc.doc);
            System.out.println(doc.getField("contents").stringValue());
        }
    }
}

3、luence知识图谱

Lucene(一)——基础_第5张图片
Paste_Image.png

refer:http://www.jianshu.com/p/c8793a06f5ae

你可能感兴趣的:(Lucene(一)——基础)