Lucene.net 系列五 --- search 上

Lucene.net 系列五 --- search 上 在前面的系列我们一直在介绍有关索引建立的问题,现在是该利用这些索引来进行搜索的时候了,Lucene良好的架构使得我们只需要很少的几行代码就可以为我们的应用加上搜索的功能,首先让我们来认识一下搜索时最常用的几个类.
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上查询特定的某个概念
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上当我们搜索完成的时候会返回一个按Sorce排序的结果集Hits. 这里的Score就是接近度的意思,象Google那样每个页面都会有一个分值,搜索结果按分值排列. 如同你使用Google一样,你不可能查看所有的结果, 你可能只查看第一个结果所以Hits返回的不是所有的匹配文档本身, 而仅仅是实际文档的引用. 通过这个引用你可以获得实际的文档.原因很好理解, 如果直接返回匹配文档,数据量太大,而很多的结果你甚至不会去看, 想想你会去看Google 搜索结果10页以后的内容吗
?
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上下面用一个例子来简要介绍一下Search
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上先建立索引
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
namespace  dotLucene.inAction.BasicSearch
Lucene.net 系列五 --- search 上
{
Lucene.net 系列五 --- search 上     [TestFixture]
Lucene.net 系列五 --- search 上     
public class BaseIndexingTestCase
Lucene.net 系列五 --- search 上     
{
Lucene.net 系列五 --- search 上         
protected String[] keywords = {"1930110994""1930110995"};
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         
protected String[] unindexed = {"Java Development with Ant""JUnit in Action"};
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         
protected String[] unstored = {
Lucene.net 系列五 --- search 上              
"we have ant and junit",
Lucene.net 系列五 --- search 上              
"junit use a mock,ant is also",
Lucene.net 系列五 --- search 上         }
;
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         
protected String[] text1 = {
Lucene.net 系列五 --- search 上              
"ant junit",
Lucene.net 系列五 --- search 上              
"junit mock"
Lucene.net 系列五 --- search 上         }
;
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         
protected String[] text2 = {
Lucene.net 系列五 --- search 上              
"200206",
Lucene.net 系列五 --- search 上              
"200309"
Lucene.net 系列五 --- search 上         }

Lucene.net 系列五 --- search 上         
protected String[] text3 = {
Lucene.net 系列五 --- search 上              
"/Computers/Ant""/Computers/JUnit"
Lucene.net 系列五 --- search 上         }
;
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         
protected Directory dir; 
Lucene.net 系列五 --- search 上         [SetUp]
Lucene.net 系列五 --- search 上         
protected void Init()
Lucene.net 系列五 --- search 上         
{
Lucene.net 系列五 --- search 上              
string indexDir = "index";
Lucene.net 系列五 --- search 上              dir 
= FSDirectory.GetDirectory(indexDir, true);
Lucene.net 系列五 --- search 上              AddDocuments(dir);
Lucene.net 系列五 --- search 上         }

Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         
protected void AddDocuments(Directory dir)
Lucene.net 系列五 --- search 上         
{
Lucene.net 系列五 --- search 上              IndexWriter writer
=new IndexWriter(dir, GetAnalyzer(), true); 
Lucene.net 系列五 --- search 上              
for (int i = 0; i < keywords.Length; i++)
Lucene.net 系列五 --- search 上              
{
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上                   Document doc 
= new Document();
Lucene.net 系列五 --- search 上                   doc.Add(Field.Keyword(
"isbn", keywords[i]));
Lucene.net 系列五 --- search 上                   doc.Add(Field.UnIndexed(
"title", unindexed[i]));
Lucene.net 系列五 --- search 上                   doc.Add(Field.UnStored(
"contents", unstored[i]));
Lucene.net 系列五 --- search 上                   doc.Add(Field.Text(
"subject", text1[i]));
Lucene.net 系列五 --- search 上                   doc.Add(Field.Text(
"pubmonth", text2[i]));
Lucene.net 系列五 --- search 上                   doc.Add(Field.Text(
"category", text3[i]));
Lucene.net 系列五 --- search 上                   writer.AddDocument(doc);
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上              }

Lucene.net 系列五 --- search 上         
Lucene.net 系列五 --- search 上              writer.Optimize();
Lucene.net 系列五 --- search 上              writer.Close();
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         }

Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         
protected virtual Analyzer GetAnalyzer()
Lucene.net 系列五 --- search 上         
{
Lucene.net 系列五 --- search 上              PerFieldAnalyzerWrapper analyzer 
= new PerFieldAnalyzerWrapper(
Lucene.net 系列五 --- search 上                   
new SimpleAnalyzer());
Lucene.net 系列五 --- search 上              analyzer.AddAnalyzer(
"pubmonth"new WhitespaceAnalyzer());
Lucene.net 系列五 --- search 上              analyzer.AddAnalyzer(
"category"new WhitespaceAnalyzer());
Lucene.net 系列五 --- search 上              
return analyzer;
Lucene.net 系列五 --- search 上         }

Lucene.net 系列五 --- search 上     }

Lucene.net 系列五 --- search 上}

Lucene.net 系列五 --- search 上这里用到了一些有关Analyzer的知识,将放在以后的系列中介绍.
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上查询特定的某个概念
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上然后利用利用TermQery来搜索一个Term(你可以把它理解为一个Word)
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         [Test]
Lucene.net 系列五 --- search 上         
public   void  Term()
Lucene.net 系列五 --- search 上         
{
Lucene.net 系列五 --- search 上              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net 系列五 --- search 上              Term t 
= new Term("subject""ant");
Lucene.net 系列五 --- search 上              Query query 
= new TermQuery(t);
Lucene.net 系列五 --- search 上              Hits hits 
= searcher.Search(query);
Lucene.net 系列五 --- search 上              Assert.AreEqual(
1, hits.Length(), "JDwA");
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上              t 
= new Term("subject""junit");
Lucene.net 系列五 --- search 上              hits 
= searcher.Search(new TermQuery(t));
Lucene.net 系列五 --- search 上              Assert.AreEqual(
2, hits.Length());
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上              searcher.Close();
Lucene.net 系列五 --- search 上         }

Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上利用QueryParse简化查询语句
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上显然对于各种各样的查询(与或关系,等等各种复杂的查询,在下面将介绍),你不希望一一对应的为它们写出相应的XXXQuery. Lucene已经为你考虑到了这点, 通过使用QueryParse这个类, 你只需要写出我们常见的搜索语句, Lucene会在内部自动做一个转换.
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上这个过程有点类似于数据库搜索, 我们已经习惯于使用SQL查询语句,其实在数据库的内部是要做一个转换的, 因为数据库不认得SQL语句,它只认得查询语法树.
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上让我们来看一个例子.
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上         [Test]
Lucene.net 系列五 --- search 上         
public   void  TestQueryParser()
Lucene.net 系列五 --- search 上         
{
Lucene.net 系列五 --- search 上              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上              Query query 
= QueryParser.Parse("+JUNIT +ANT -MOCK",
Lucene.net 系列五 --- search 上                                              
"contents",
Lucene.net 系列五 --- search 上                                              
new SimpleAnalyzer());
Lucene.net 系列五 --- search 上              Hits hits 
= searcher.Search(query);
Lucene.net 系列五 --- search 上              Assert.AreEqual(
1, hits.Length());
Lucene.net 系列五 --- search 上              Document d 
= hits.Doc(0);
Lucene.net 系列五 --- search 上              Assert.AreEqual(
"Java Development with Ant", d.Get("title"));
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上              query 
= QueryParser.Parse("mock OR junit",
Lucene.net 系列五 --- search 上                                        
"contents",
Lucene.net 系列五 --- search 上                                        
new SimpleAnalyzer());
Lucene.net 系列五 --- search 上              hits 
= searcher.Search(query);
Lucene.net 系列五 --- search 上              Assert.AreEqual(
2, hits.Length(), "JDwA and JIA");
Lucene.net 系列五 --- search 上         }

Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上由以上的代码可以看出我们不需要为每种特定查询而去设定XXXQuery 通过QueryParse类的静态方法Parse就可以很方便的将可读性好的查询口语转换成Lucene内部所使用的各种复杂的查询语句. 有一点需要注意:在Parse方法中我们使用了SimpleAnalyzer, 这时候会将查询语句做一些变换,比如这里将JUNIT 等等大写字母变成了小写字母,所以才能搜索到(因为我们在建立索引的时候使用的是小写),如果你将StanderAnalyzer变成WhitespaceAnalyzer就会搜索不到.具体原理以后再说.
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
+ + B表示A和B要同时存在, - C表示C不存在,A OR B表示A或B二者有一个存在就可以..具体的查询规则如下:
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上其中title等等的field表示你在建立索引时所采用的属性名.
Lucene.net 系列五 --- search 上
Lucene.net 系列五 --- search 上

你可能感兴趣的:(Lucene)