您的位置:首页 > 其它

lucene index

2017-12-01 16:26 141 查看
luke下载:https://github.com/DmitryKey/luke/releases

官网给出的一个小demo:

http://lucene.apache.org/core/7_1_0/core/overview-summary.html#overview.description

Analyzer analyzer = new StandardAnalyzer();

// Store the index in memory:
Directory directory = new RAMDirectory();
// To store an index on disk, use this instead:
//Directory directory = FSDirectory.open("/tmp/testindex");
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter iwriter = new IndexWriter(directory, config);
Document doc = new Document();
String text = "This is the text to be indexed.";
doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
iwriter.addDocument(doc);
iwriter.close();

// Now search the index:
DirectoryReader ireader = DirectoryReader.open(directory);
IndexSearcher isearcher = new IndexSearcher(ireader);
// Parse a simple query that searches for "text":
QueryParser parser = new QueryParser("fieldname", analyzer);
Query query = parser.parse("text");
ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
assertEquals(1, hits.length);
// Iterate through the results:
for (int i = 0; i < hits.length; i++) {
Document hitDoc = isearcher.doc(hits[i].doc);
assertEquals("This is the text to be indexed.", hitDoc.get("fieldname"));
}
ireader.close();
directory.close();


下面只关注建索引的过程。

Lucene API包含几个包:

org.apache.lucene.analysis定义了一个抽象Analyzer API,它能把文本从Reader转化为TokenStream,一系列的token Attributes。TokenStream能够通过在Tokenizer的输出上应用TokenFilters。Tokenizers和TokenFilters串在一起,使用一个Analyzer。analyzers-common提供了几个Analyzer实现,包括StopAnalyzer和基于语法的StandardAnalyzer。

org.apache.lucne.codecs提供了一个抽象类,来编码和解码索引结构,并且不同的实现根据应用需求。

org.apache.lucene.document提供了一个简单的Document类。Document简单的由一组命名的Fields组成,它的值可能是字符串或者Reader的实例。

org.apache.lucene.index提供了两个主要的类:IndexWriter,它负责创造和添加documents到索引中;IndexReader,负责访问索引中的数据。

org.apache.lucene.search提供了一个数据结构来表示queries(例如:TermQuery表示单独的词,PhraseQuery表示短语,BooleanQuery表示queries的boolean组合)。IndexSearcher将queries转化为TopDocs。提供了一系列的QueryParsers把strings或xml转化为query结构。

org.apache.lucene.store定义了一个抽象的类来存储持久对象,Directory,这是一系列的命名文件,被IndexOutput写入,被IndexInput读。提供了多种实现,包括FSDirectory,它用一个文件系统目录来存储文件,RAMDirectory,实现了用内存数据结构来表示文件。

org.apache.lucene.util包括几个方便的数据结构和工具类,例如FixedBitSet和PriorityQuene。

应用应该这样使用Lucene:

添加Fields到Documents;

创建一个IndexWriter,用addDocument()方法添加documents;

调用QueryParser.parse()方法从string构建一个query;

创建一个IndexSearcher,将query传给search()方法。

下面主要看建立索引。

建索引相关的类有Directory、IndexWriter、Analyzer、IndexWriterConfig、Document、Field。



Documents是索引和搜索的基本单元。一个Document是一组fields。每个field有一个名字和一个文本值。一个field可以被存储在document中,这种情况下,搜索时可以返回。因此每个document应该至少包含一个stored fields来唯一标识它。

注意:没有被stored的fields搜索时不可访问,如,ScoreDoc.doc或者IndexReader.document(int)。



一个field是一个Document中的一部分。每个field包含三部分:名字、类型和值。值可能是text(String,Reader或pre-analyzed TokenStream),binary(byte[]),或者数值(a Number)。Fields可以被存储到索引中,所以搜索时可以返回。

**注意:**field类型是IndexableFieldType。改变IndexableFieldType的状态将会影响任何用它的Field。强烈建议Field实例化后不要改变。

下图中Field.Store内部类,代表是否要存储:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lucene index luke