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

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

3搜索过程:
.获得用户搜索内容,对搜索内容进行分词,得到用户搜索的所有词条。
.将词条在倒排索引列表中进行匹配,得到包含该词条的所有文档编号。
Lucene 全文检索就是对文档中全部内容进行分词,然后对所有单词建立倒排索引的过程。
2、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知识图谱

网友评论