Lucene.net系列六 -- search 下

Lucene.net系列六 -- search 下 本文主要结合测试案例介绍了Lucene下的各种查询语句以及它们的简化方法.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下通过本文你将了解Lucene的基本查询语句,并通过学习相关的测试代码以加强了解.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下源代码下载
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下具体的查询语句
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下在了解了SQL后, 你是否想了解一下查询语法树
? 在这里简要介绍一些能被Lucene直接使用的查询语句.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
1 .         TermQuery
Lucene.net系列六 -- search 下查询某个特定的词,在文章开始的例子中已有介绍.常用于查询关键字.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下             [Test]
Lucene.net系列六 -- search 下         
public   void  Keyword()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Term t 
= new Term("isbn""1930110995");
Lucene.net系列六 -- search 下              Query query 
= new TermQuery(t);
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
1, hits.Length(), "JUnit in Action");
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下注意Lucene中的关键字,是需要用户去保证唯一性的.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下 TermQuery和QueryParse
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下只要在QueryParse的Parse方法中只有一个word,就会自动转换成TermQuery.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
2 .         RangeQuery
Lucene.net系列六 -- search 下用于查询范围,通常用于时间,还是来看例子:
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
namespace  dotLucene.inAction.BasicSearch
Lucene.net系列六 -- search 下
{
Lucene.net系列六 -- search 下     
public class RangeQueryTest : LiaTestCase
Lucene.net系列六 -- search 下     
{
Lucene.net系列六 -- search 下         
private Term begin, end; 
Lucene.net系列六 -- search 下         [SetUp]
Lucene.net系列六 -- search 下         
protected override void Init()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              begin 
= new Term("pubmonth""200004");
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              end 
= new Term("pubmonth""200206");
Lucene.net系列六 -- search 下              
base.Init();
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public void Inclusive()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              RangeQuery query 
= new RangeQuery(begin, end, true);
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
1, hits.Length());
Lucene.net系列六 -- search 下         }
 
Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public void Exclusive()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              RangeQuery query 
= new RangeQuery(begin, end, false);
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
0, hits.Length());
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下     }

Lucene.net系列六 -- search 下}

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下RangeQuery的第三个参数用于表示是否包含该起止日期.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下RangeQuery和QueryParse
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              [Test]
Lucene.net系列六 -- search 下         
public   void  TestQueryParser()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              Query query 
= QueryParser.Parse("pubmonth:[200004 TO 200206]""subject"new SimpleAnalyzer());
Lucene.net系列六 -- search 下              Assert.IsTrue(query 
is RangeQuery);
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              query 
= QueryParser.Parse("{200004 TO 200206}""pubmonth"new SimpleAnalyzer());
Lucene.net系列六 -- search 下              hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
0, hits.Length(), "JDwA in 200206");
Lucene.net系列六 -- search 下         }
 
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下Lucene用[] 和
{} 分别表示包含和不包含.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
3 .   PrefixQuery
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下用于搜索是否包含某个特定前缀,常用于Catalog的检索.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下           [Test]
Lucene.net系列六 -- search 下         
public    void   TestPrefixQuery()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              PrefixQuery query 
= new PrefixQuery(new Term("category""/Computers"));
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
2, hits.Length());
Lucene.net系列六 -- search 下              
Lucene.net系列六 -- search 下              query 
= new PrefixQuery(new Term("category""/Computers/JUnit"));
Lucene.net系列六 -- search 下              hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
1, hits.Length(), "JUnit in Action");
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下PrefixQuery和QueryParse
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              [Test]
Lucene.net系列六 -- search 下         
public   void  TestQueryParser()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              QueryParser qp 
= new QueryParser("category"new SimpleAnalyzer());
Lucene.net系列六 -- search 下              qp.SetLowercaseWildcardTerms(
false);
Lucene.net系列六 -- search 下              Query query 
=qp.Parse("/Computers*");
Lucene.net系列六 -- search 下              Console.Out.WriteLine(
"query = {0}", query.ToString());
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
2, hits.Length());
Lucene.net系列六 -- search 下              query 
=qp.Parse("/Computers/JUnit*");
Lucene.net系列六 -- search 下              hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
1, hits.Length(), "JUnit in Action");
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下这里需要注意的是我们使用了QueryParser对象,而不是QueryParser类. 原因在于使用对象可以对QueryParser的一些默认属性进行修改.比如在上面的例子中我们的category是大写的,而QueryParser默认会把所有的含
* 的查询字符串变成小写 / computer * . 这样我们就会查不到原文中的 / Computers *  ,所以我们需要通过设置QueryParser的默认属性来改变这一默认选项.即qp.SetLowercaseWildcardTerms( false )所做的工作. 
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
4 .    BooleanQuery
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下用于测试满足多个条件.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下下面两个例子用于分别测试了满足与条件和或条件的情况.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public   void  And()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              TermQuery searchingBooks 
=
Lucene.net系列六 -- search 下                   
new TermQuery(new Term("subject""junit"));
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              RangeQuery currentBooks 
=
Lucene.net系列六 -- search 下                   
new RangeQuery(new Term("pubmonth""200301"),
Lucene.net系列六 -- search 下                                  
new Term("pubmonth""200312"),
Lucene.net系列六 -- search 下                                  
true);
Lucene.net系列六 -- search 下              BooleanQuery currentSearchingBooks 
= new BooleanQuery();
Lucene.net系列六 -- search 下              currentSearchingBooks.Add(searchingBooks, 
truefalse);
Lucene.net系列六 -- search 下              currentSearchingBooks.Add(currentBooks, 
truefalse);
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(currentSearchingBooks);
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下              AssertHitsIncludeTitle(hits, 
"JUnit in Action");
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public   void  Or()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              TermQuery methodologyBooks 
= new TermQuery(
Lucene.net系列六 -- search 下                   
new Term("category",
Lucene.net系列六 -- search 下                            
"/Computers/JUnit"));
Lucene.net系列六 -- search 下              TermQuery easternPhilosophyBooks 
= new TermQuery(
Lucene.net系列六 -- search 下                   
new Term("category",
Lucene.net系列六 -- search 下                            
"/Computers/Ant"));
Lucene.net系列六 -- search 下              BooleanQuery enlightenmentBooks 
= new BooleanQuery();
Lucene.net系列六 -- search 下              enlightenmentBooks.Add(methodologyBooks, 
falsefalse);
Lucene.net系列六 -- search 下              enlightenmentBooks.Add(easternPhilosophyBooks, 
falsefalse);
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(enlightenmentBooks);
Lucene.net系列六 -- search 下              Console.Out.WriteLine(
"or = " + enlightenmentBooks);
Lucene.net系列六 -- search 下              AssertHitsIncludeTitle(hits, 
"Java Development with Ant");
Lucene.net系列六 -- search 下              AssertHitsIncludeTitle(hits, 
"JUnit in Action");
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下什么时候是与什么时候又是或
?  关键在于BooleanQuery对象的Add方法的参数.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下参数一是待添加的查询条件.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下参数二Required表示这个条件必须满足吗
?  True表示必须满足, False表示可以不满足该条件.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下参数三Prohibited表示这个条件必须拒绝吗
?  True表示这么满足这个条件的结果要排除, False表示可以满足该条件.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下这样会有三种组合情况,如下表所示:
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下BooleanQuery和QueryParse
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public   void  TestQueryParser()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              Query query 
= QueryParser.Parse("pubmonth:[200301 TO 200312] AND junit""subject"new SimpleAnalyzer());
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
1, hits.Length());
Lucene.net系列六 -- search 下              query 
= QueryParser.Parse("/Computers/JUnit OR /Computers/Ant""category"new WhitespaceAnalyzer());
Lucene.net系列六 -- search 下              hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
2, hits.Length());
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下注意AND和OR的大小 如果想要A与非B 就用 A AND –B 表示, 
+ A –B也可以.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下默认的情况下QueryParser会把空格认为是或关系,就象google一样.但是你可以通过QueryParser对象修改这一属性.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下[Test]
Lucene.net系列六 -- search 下         
public   void  TestQueryParserDefaultAND()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              QueryParser qp 
= new QueryParser("subject"new SimpleAnalyzer());
Lucene.net系列六 -- search 下              qp.SetOperator(QueryParser.DEFAULT_OPERATOR_AND );
Lucene.net系列六 -- search 下              Query query 
= qp.Parse("pubmonth:[200301 TO 200312] junit");
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
1, hits.Length());
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
5 .         PhraseQuery
Lucene.net系列六 -- search 下查询短语,这里面主要有一个slop的概念, 也就是各个词之间的位移偏差, 这个值会影响到结果的评分.如果slop为0,当然最匹配.看看下面的例子就比较容易明白了,有关slop的计算用户就不需要理解了,不过slop太大的时候对查询效率是有影响的,所以在实际使用中要把该值设小一点. PhraseQuery对于短语的顺序是不管的,这点在查询时除了提高命中率外,也会对性能产生很大的影响, 利用SpanNearQuery可以对短语的顺序进行控制,提高性能.
Lucene.net系列六 -- search 下        [SetUp]
Lucene.net系列六 -- search 下     
protected   void  Init()
Lucene.net系列六 -- search 下     
{
Lucene.net系列六 -- search 下         
// set up sample document
Lucene.net系列六 -- search 下
         RAMDirectory directory = new RAMDirectory();
Lucene.net系列六 -- search 下         IndexWriter writer 
= new IndexWriter(directory,
Lucene.net系列六 -- search 下                                              
new WhitespaceAnalyzer(), true);
Lucene.net系列六 -- search 下         Document doc 
= new Document();
Lucene.net系列六 -- search 下         doc.Add(Field.Text(
"field",
Lucene.net系列六 -- search 下                            
"the quick brown fox jumped over the lazy dog"));
Lucene.net系列六 -- search 下         writer.AddDocument(doc);
Lucene.net系列六 -- search 下         writer.Close();
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下     }

Lucene.net系列六 -- search 下      
private   bool  matched(String[] phrase,  int  slop)
Lucene.net系列六 -- search 下     
{
Lucene.net系列六 -- search 下         PhraseQuery query 
= new PhraseQuery();
Lucene.net系列六 -- search 下         query.SetSlop(slop);
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         
for (int i = 0; i < phrase.Length; i++)
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              query.Add(
new Term("field", phrase[i]));
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下         
return hits.Length() > 0;
Lucene.net系列六 -- search 下     }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下     [Test]
Lucene.net系列六 -- search 下     
public   void  SlopComparison()
Lucene.net系列六 -- search 下     
{
Lucene.net系列六 -- search 下         String[] phrase 
= new String[]{"quick""fox"};
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         Assert.IsFalse(matched(phrase, 
0), "exact phrase not found");
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         Assert.IsTrue(matched(phrase, 
1), "close enough");
Lucene.net系列六 -- search 下     }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下     [Test]
Lucene.net系列六 -- search 下     
public   void  Reverse()
Lucene.net系列六 -- search 下     
{
Lucene.net系列六 -- search 下         String[] phrase 
= new String[] {"fox""quick"};
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         Assert.IsFalse(matched(phrase, 
2), "exact phrase not found");
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         Assert.IsTrue(matched(phrase, 
3), "close enough");
Lucene.net系列六 -- search 下     }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下     [Test]
Lucene.net系列六 -- search 下     
public   void  Multiple() -
Lucene.net系列六 -- search 下     
{
Lucene.net系列六 -- search 下         Assert.IsFalse(matched(
new String[] {"quick""jumped""lazy"}3), "not close enough");
Lucene.net系列六 -- search 下         Assert.IsTrue(matched(
new String[] {"quick""jumped""lazy"}4), "just enough");
Lucene.net系列六 -- search 下         Assert.IsFalse(matched(
new String[] {"lazy""jumped""quick"}7), "almost but not quite");
Lucene.net系列六 -- search 下         Assert.IsTrue(matched(
new String[] {"lazy""jumped""quick"}8), "bingo");
Lucene.net系列六 -- search 下     }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下PhraseQuery和QueryParse
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下利用QueryParse进行短语查询的时候要先设定slop的值,有两种方式如下所示
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下[Test]
Lucene.net系列六 -- search 下     
public   void  TestQueryParser()
Lucene.net系列六 -- search 下     
{
Lucene.net系列六 -- search 下         Query q1 
= QueryParser.Parse(""quick fox"",
Lucene.net系列六 -- search 下              
"field"new SimpleAnalyzer());
Lucene.net系列六 -- search 下         Hits hits1 
= searcher.Search(q1);
Lucene.net系列六 -- search 下         Assert.AreEqual(hits1.Length(), 
0);
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         Query q2 
= QueryParser.Parse(""quick fox"~1",          //第一种方式
Lucene.net系列六 -- search 下
                                     "field"new SimpleAnalyzer());
Lucene.net系列六 -- search 下         Hits hits2 
= searcher.Search(q2);
Lucene.net系列六 -- search 下         Assert.AreEqual(hits2.Length(), 
1);
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         QueryParser qp 
= new QueryParser("field"new SimpleAnalyzer());
Lucene.net系列六 -- search 下         qp.SetPhraseSlop(
1);                                    //第二种方式
Lucene.net系列六 -- search 下
         Query q3=qp.Parse(""quick fox"");
Lucene.net系列六 -- search 下         Assert.AreEqual(
""quick fox"~1", q3.ToString("field"),"sloppy, implicitly");
Lucene.net系列六 -- search 下         Hits hits3 
= searcher.Search(q2);
Lucene.net系列六 -- search 下         Assert.AreEqual(hits3.Length(), 
1);
Lucene.net系列六 -- search 下     }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
6 .         WildcardQuery
Lucene.net系列六 -- search 下通配符搜索,需要注意的是child, mildew的分值是一样的. 
Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public   void  Wildcard()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              IndexSingleFieldDocs(
new Field[]
Lucene.net系列六 -- search 下                   
{
Lucene.net系列六 -- search 下                       Field.Text(
"contents""wild"),
Lucene.net系列六 -- search 下                       Field.Text(
"contents""child"),
Lucene.net系列六 -- search 下                       Field.Text(
"contents""mild"),
Lucene.net系列六 -- search 下                       Field.Text(
"contents""mildew")
Lucene.net系列六 -- search 下                   }
);
Lucene.net系列六 -- search 下              IndexSearcher searcher 
= new IndexSearcher(directory);
Lucene.net系列六 -- search 下              Query query 
= new WildcardQuery(
Lucene.net系列六 -- search 下                   
new Term("contents""?ild*"));
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
3, hits.Length(), "child no match");
Lucene.net系列六 -- search 下              Assert.AreEqual(hits.Score(
0), hits.Score(1), 0.0"score the same");
Lucene.net系列六 -- search 下              Assert.AreEqual(hits.Score(
1), hits.Score(2), 0.0"score the same");
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下WildcardQuery和QueryParse
Lucene.net系列六 -- search 下需要注意的是出于性能的考虑使用QueryParse的时候,不允许在开头就使用就使用通配符.
Lucene.net系列六 -- search 下同样处于性能考虑会将只在末尾含有
* 的查询词转换为PrefixQuery.
Lucene.net系列六 -- search 下         [Test, ExpectedException(
typeof  (ParseException))]
Lucene.net系列六 -- search 下         
public   void  TestQueryParserException()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              Query query 
= QueryParser.Parse("?ild*""contents"new WhitespaceAnalyzer());
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public   void  TestQueryParserTailAsterrisk()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              Query query 
= QueryParser.Parse("mild*""contents"new WhitespaceAnalyzer());
Lucene.net系列六 -- search 下              Assert.IsTrue(query 
is PrefixQuery);
Lucene.net系列六 -- search 下              Assert.IsFalse(query 
is WildcardQuery);
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 下              Query query 
= QueryParser.Parse("mi?d*""contents"new WhitespaceAnalyzer());
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual(
2, hits.Length());
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
7 .         FuzzyQuery
Lucene.net系列六 -- search 下模糊查询, 需要注意的是两个匹配项的分值是不同的,这点和WildcardQuery是不同的
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public   void  Fuzzy()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              Query query 
= new FuzzyQuery(new Term("contents""wuzza"));
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual( 
2, hits.Length(),"both close enough");
Lucene.net系列六 -- search 下              Assert.IsTrue(hits.Score(
0!= hits.Score(1),"wuzzy closer than fuzzy");
Lucene.net系列六 -- search 下              Assert.AreEqual(
"wuzzy", hits.Doc(0).Get("contents"),"wuzza bear");
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下FuzzyQuery和QueryParse
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下注意和PhraseQuery中表示slop的区别,前者
~ 后要跟数字.
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下         [Test]
Lucene.net系列六 -- search 下         
public   void  TestQueryParser()
Lucene.net系列六 -- search 下         
{
Lucene.net系列六 -- search 下              Query query 
=QueryParser.Parse("wuzza~","contents",new SimpleAnalyzer());
Lucene.net系列六 -- search 下              Hits hits 
= searcher.Search(query);
Lucene.net系列六 -- search 下              Assert.AreEqual( 
2, hits.Length(),"both close enough");
Lucene.net系列六 -- search 下         }

Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下
Lucene.net系列六 -- search 下

你可能感兴趣的:(Lucene)