lucene建立索引和各种方式的搜索

来源:互联网 发布:nginx 伪静态配置 编辑:程序博客网 时间:2024/06/07 00:55

lucene建立索引、FuzzyQuery方式检索(可以简单地识别两个相近的词语)、PrefixQuery方式检索(前缀查询)、RangeQuery方式查询(在某个范围)、TermQuery方式查询(词条搜索)

lucene建立索引

package testindex;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;public class TestIndex {    /**     * user(id,name,address)     * insert into user(id,name,address) values(1,'zhangsan','shanghaichangningqv');     * @throws IOException      */    public static void main(String[] args) throws IOException {        String [] ids={"1","2","3"};        String [] names={"zhangsan","lisi","wangwu"};        String [] addresses={"shanghai","beijing","guangzhou"};        String [] birthday={"19820903","19920603","19850603"};        Analyzer analyzer=new StandardAnalyzer();        String indexDir="C:/Users/yihong/Desktop/luceneindex";        Directory dir=FSDirectory.getDirectory(indexDir);        //true 表示创建或覆盖当前索引;false表示对当前索引进行追加        //Default value is 128        IndexWriter writer=new IndexWriter(dir,analyzer,true,IndexWriter.MaxFieldLength.LIMITED);        for(int i=0;i<ids.length;i++){            Document document=new Document();            document.add(new Field("id",ids[i],Field.Store.YES,Field.Index.ANALYZED));            document.add(new Field("name",names[i],Field.Store.YES,Field.Index.ANALYZED));            document.add(new Field("address",addresses[i],Field.Store.YES,Field.Index.ANALYZED));            document.add(new Field("birthday",birthday[i],Field.Store.YES,Field.Index.ANALYZED));            writer.addDocument(document);        }        writer.optimize();        writer.close();    }}

FuzzyQuery方式检索(可以简单地识别两个相近的词语)

package TestSercher;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;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.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;public class TestFuzzyQuery {    public static void main(String[] args) throws IOException {        Analyzer analyzer=new StandardAnalyzer();        String indexDir="C:/Users/yihong/Desktop/luceneindex";        Directory dir=FSDirectory.getDirectory(indexDir);        IndexSearcher searcher=new IndexSearcher(dir);        ScoreDoc [] hits=null;        Term term=new Term("name","zhangsan");        FuzzyQuery query=new FuzzyQuery(term);        TopDocs topDocs=searcher.search(query, 10);        hits=topDocs.scoreDocs;        for(int i=0;i<hits.length;i++){            Document doc=searcher.doc(hits[i].doc);//          System.out.print(hits[i].score+" ");            System.out.print(doc.get("id")+" ");            System.out.print(doc.get("name")+" ");            System.out.print(doc.get("address")+" ");            System.out.println(doc.get("birthday")+" ");        }        searcher.close();        dir.close();    }}

PrefixQuery方式检索(前缀查询)

package TestSercher;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.Term;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.PrefixQuery;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;public class TestPrefixQuery {    public static void main(String[] args) throws IOException {        Analyzer analyzer=new StandardAnalyzer();        String indexDir="C:/Users/yihong/Desktop/luceneindex";        Directory dir=FSDirectory.getDirectory(indexDir);        IndexSearcher searcher=new IndexSearcher(dir);        ScoreDoc [] hits=null;        Term term=new Term("name","zh");        PrefixQuery query=new PrefixQuery(term);        TopDocs topDocs=searcher.search(query, 10);        hits=topDocs.scoreDocs;        for(int i=0;i<hits.length;i++){            Document doc=searcher.doc(hits[i].doc);//          System.out.print(hits[i].score+" ");            System.out.print(doc.get("id")+" ");            System.out.print(doc.get("name")+" ");            System.out.print(doc.get("address")+" ");            System.out.println(doc.get("birthday")+" ");        }        searcher.close();        dir.close();    }}

RangeQuery方式查询(在某个范围)

package TestSercher;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.Term;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.RangeQuery;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;public class TestRangeQuery {    public static void main(String[] args) throws IOException {        Analyzer analyzer=new StandardAnalyzer();        String indexDir="C:/Users/yihong/Desktop/luceneindex";        Directory dir=FSDirectory.getDirectory(indexDir);        IndexSearcher searcher=new IndexSearcher(dir);        ScoreDoc [] hits=null;        Term beginTerm=new Term("birthday","19820720");        Term endTerm=new Term("birthday","19830130");        RangeQuery query=new RangeQuery(beginTerm,endTerm,true);        TopDocs topDocs=searcher.search(query, 2);        hits=topDocs.scoreDocs;        for(int i=0;i<hits.length;i++){            Document doc=searcher.doc(hits[i].doc);//          System.out.print(hits[i].score+" ");            System.out.print(doc.get("id")+" ");            System.out.print(doc.get("name")+" ");            System.out.print(doc.get("address")+" ");            System.out.println(doc.get("birthday")+" ");        }        searcher.close();        dir.close();    }}

TermQuery方式查询(词条搜索)

package TestSercher;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.Term;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;public class TestSercher {    public static void main(String[] args) throws IOException {        Analyzer analyzer=new StandardAnalyzer();        String indexDir="C:/Users/yihong/Desktop/luceneindex";        Directory dir=FSDirectory.getDirectory(indexDir);        IndexSearcher searcher=new IndexSearcher(dir);        ScoreDoc [] hits=null;        Term term=new Term("address","beijing");        TermQuery query=new TermQuery(term);        TopDocs topDocs=searcher.search(query, 10);        hits=topDocs.scoreDocs;        for(int i=0;i<hits.length;i++){            Document doc=searcher.doc(hits[i].doc);            System.out.print(hits[i].score+" ");            System.out.print(doc.get("id")+" ");            System.out.print(doc.get("name")+" ");            System.out.print(doc.get("address")+" ");            System.out.println(doc.get("birthday")+" ");        }        searcher.close();        dir.close();    }}