您的位置:首页 > 产品设计 > UI/UE

lucene query

2017-11-30 15:34 369 查看
建立索引后,给定一个查询词,可以进行搜索,官网有个建索引和搜索的小demo:

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();


下面只看搜索的过程。

搜索重要的类:

IndexSearcher
search
方法会返回搜索的结果
ScoreDoc
数组,
search
方法需要传入
Query
对象,这个对象代表了搜索条件。

下面介绍Query对象及其常用的子类:

http://lucene.apache.org/core/7_1_0/core/org/apache/lucene/search/Query.html



还有一个类QueryParser,它的parse方法可以产生Query:

http://lucene.apache.org/core/7_1_0/queryparser/org/apache/lucene/queryparser/classic/QueryParser.html



这个类是由JavaCC产生的。最重要的方法是 QueryParserBase.parse(String)。查询语句的语法是:一个
Query
是一系列的分句。一个分句可能由下面的符号开头:

加号(+)或者减号(-),分别表明这个分句是必须的和被禁止的;

一个term后面跟一个冒号,表明哪个字段被搜索。这个可以创建在多个字段检索的queries。

一个分句可能是下面任何一个:

一个term,表明所有包含这个term的文档;或者

一个嵌套的query,被一对圆括号包含。注意,可以在前面加一个+/-。

所以,在BNF中,查询语法是:

Query  ::= (Clause)*
Clause ::= ["+", "-"] [<TERM> ":"] (<TERM> | "(" Query ")")


正确格式的查询语句的例子可以在这里查看:query syntax documentation

下面是查看索引中所有的行的代码:

File path = new File("e:/index/suizhiIndex20170727");
Directory directory = FSDirectory.open(path);
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
for (int i = 0; i < reader.maxDoc(); i++) {
Document doc = searcher.doc(i);
//...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lucene 搜索