Practice Every Day_12(精确搜索和模糊搜索)

            今天看了搜索的相关知识,了解了几种搜索方法。下面来总结一下:

            主要有两类方法:一类是创建Term,然后以Term为参数构建****Term

             1、词条搜索:TermQue

                   方法示例:Term t=new Term(String field,String keyword);                    

                                       TermQuery q=new TermQuery(t);

              2、组合搜索:BooleanQuery

                   方法实例:Term t1=new Term(String field,String keyword);

                                       TermQuery q1=new TermQuery(t1);

                                       Term t2=new Term(String field,String keyword);

                                       TermQuery q2=new TermQuery(t2);

                                       BooleanQuery q=new BooleanQuery();

                                       q.add(q1,BooleanClause.Occur.MUST)MUST代表必须含有;

                                       q.add(q2,BooleanClause.Occur.Not_MUST);Not_MUST代表一定不含有;SHOULD表可以有

             3、范围搜索:RangeQuery

                   方法实例:Query query=new TermRangeQuery(String field,String start,String end,Boolean inclusive,Boolean inclusive);

             4、前缀搜索:PrefixQuery

                   方法实例:Term t=new Term(String field,String keyword);                    

                                       Query q=new PrefixQuery(t);

             5、短语搜索:PhraseQuery(可以设置匹配度)

                    方法示例:Term t1=new Term(String field,String keyword);

                                         Term t2=new Term(String field,String keyword);

                                         PhraseQuery q=new PhraseQuery();

                                         q.setslop(int num);//设置t1中的keyword和t2中的keyword之间的单词数

                                        q.add(t1);

                                         q.add(t2);

               6、多短语搜索:MultiPhraseQuery

                     方法示例:Term t=new Term(String field,String keyword);

                                      Term t1=new Term(String field,String keyword);

                                      Term t2=new Term(String field,String keyword);

                                      MultiPhraseQuery q=new MultiPhraseQuery();

                                      q.add(t);//统一前缀

                                      q.add(new Term[]{t1,t2});//后缀

                7、模糊搜索:FuzzyQuery

                      方法实例: Term t=new Term(String field,String keyword);

                                           FuzzyQuery q=new FuzzyQuery(t,float f);

               8、通配符搜索:WildcardQuery

                     方法实例:Term t=new Term(String field,String keyword*);

                                         WildcardQuery q=new WildcardQuery(t);

                        常用*表示任意多个字符,用?表示任意一个字符

恩,今天有点晚了,另一类方法明天写。

我用TermQuery和FuzzyQuery写了一个程序,可是运行不出结果来,郁闷啊!

以下是代码,帮忙找找错哈!

package MySearcher;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
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.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class FuzzySearcher
{     
        private final static Analyzer analyzer=new IKAnalyzer();
        private static String ids[]={"01","02","03","04","05","06","07","08","09","10"};
        private static String names[]={"Lucy","Lily","Jerry","Mike","Tom","王琪琪","李木子","王聪聪","张小花","猪猪"};
        private static String address[]={"王大街","Green Street","White Streen","主大街","金晶大道","王府井","House Avenue","洪沟小区","张家界","Living Avenue"};
  public static void main(String[] args) throws IOException ,CorruptIndexException
  {
   String f="address";
   String s="王大街";
   int num=10;
      index();  
   System.out.println("精确搜索的结果为");
         searcher1(f,s, num);
      System.out.println("模糊搜索的结果为");
         searcher2(f,s,num);
     }
       public static void index() throws CorruptIndexException, LockObtainFailedException, IOException
       {       
        Directory directory=FSDirectory.open(new File("f:Lucene/Index_04"));
        IndexWriterConfig iwc=new IndexWriterConfig(Version.LUCENE_35,analyzer);
        IndexWriter writer=new IndexWriter(directory,iwc);   
        for(int i=0;i<ids.length;i++)
        {
         Document doc=new Document();
         doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
         doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.ANALYZED));
         doc.add(new Field("address",address[i],Field.Store.YES,Field.Index.ANALYZED));
           writer.addDocument(doc) ;
        }
        writer.close();
       }
   public static void searcher1(String f,String s,int num) throws IOException,CorruptIndexException
   {
  Directory directory=FSDirectory.open(new File("f:Lucene/Index_04"));
  IndexReader reader= IndexReader.open(directory);
  IndexSearcher searcher=new IndexSearcher(reader);
  Term t=new Term(f,s);
  TermQuery query=new TermQuery(t);
  TopDocs tds=searcher.search(query,num);
  int total=tds.totalHits;
     System.out.println("共搜索到"+total+"条结果");
  ScoreDoc[] sds=tds.scoreDocs;
    for(ScoreDoc sd:sds)
    {
     Document doc=searcher.doc(sd.doc);
     System.out.println(doc.get("id")+doc.get("name")+doc.get("address"));
    }
    searcher.close();
   }
      public static void searcher2(String f,String s,int num) throws CorruptIndexException, IOException
  {
     Directory directory=FSDirectory.open(new File("e:Lucene实例/Index_01"));
    IndexReader reader= IndexReader.open(directory);
    IndexSearcher searcher=new IndexSearcher(reader);
    Term t=new Term(f,s);
    FuzzyQuery query=new FuzzyQuery(t,0.3f);
    TopDocs tds=searcher.search(query,num);
    int total=tds.totalHits;
       System.out.println("共搜索到"+total+"条结果");
    ScoreDoc[] sds=tds.scoreDocs;
      for(ScoreDoc sd:sds)
      {
       Document doc=searcher.doc(sd.doc);
       System.out.println(doc.get("id")+doc.get("name")+doc.get("address"));
      }
      reader.close();
      searcher.close();
     }  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值