- package myExample4;
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.document.Document;
- import org.apache.lucene.document.Field;
- import org.apache.lucene.document.NumericField;
- import org.apache.lucene.index.*;
- import org.apache.lucene.search.*;
- import org.apache.lucene.store.Directory;
- import org.apache.lucene.store.FSDirectory;
- import org.apache.lucene.util.Version;
- import org.wltea.analyzer.lucene.IKAnalyzer;
- import java.io.File;
- import java.io.IOException;
- import java.util.Date;
- /**
- * @author: cuiH
- * Date: 13-6-28
- * Lucence有多种搜索方式,该例子用于检测多个检索方式
- */
- public class myTestQuery {
- public static final String indexPath = "d:/lucene/index";
- public static final Version VERSION_36 = Version.LUCENE_36;
- public static Analyzer analyzer = new IKAnalyzer();
- /**
- * 搜索结果排序方式(该字段索引时必须isIndexed=true)
- */
- public static Sort sort = new Sort(new SortField("birth", SortField.INT, false));
- public static void index() throws Exception {
- Date start = new Date();
- System.out.println("Indexing to directory '" + indexPath + "' ");
- Directory dir = FSDirectory.open(new File(indexPath));
- IndexWriterConfig iwc = new IndexWriterConfig(VERSION_36, analyzer);
- iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
- // iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
- // iwc.setRAMBufferSizeMB(1024.0);
- IndexWriter writer = new IndexWriter(dir, iwc);
- indexDocs(writer);
- writer.close();
- Date end = new Date();
- System.out.println(end.getTime() - start.getTime() + " total milliseconds");
- }
- public static void indexDocs(IndexWriter writer) throws IOException {
- for (String info : data) {
- String[] ss = info.split("\\\\|");
- Document doc = new Document();
- Field field_id = new Field("id", ss[0], Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS);
- field_id.setIndexOptions(FieldInfo.IndexOptions.DOCS_ONLY);
- doc.add(field_id);
- Field field_name = new Field("name", ss[1], Field.Store.YES, Field.Index.ANALYZED);
- doc.add(field_name);
- NumericField field_birth = new NumericField("birth", Field.Store.YES, true);
- field_birth.setIntValue(Integer.valueOf(ss[2]));
- doc.add(field_birth);
- Field field_desc = new Field("desc", ss[3], Field.Store.YES, Field.Index.ANALYZED);
- doc.add(field_desc);
- if (writer.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE)
- writer.addDocument(doc);
- else
- writer.updateDocument(new Term("id", ss[0]), doc);
- }
- }
- /**
- * 测试各种Query
- *
- * @throws Exception
- */
- private static void testQuery() throws Exception {
- /**获取IndexSearcher*/
- IndexReader reader = IndexReader.open(FSDirectory.open(new File(indexPath)));
- IndexSearcher searcher = new IndexSearcher(reader);
- /**1.TermQuery 按词条搜索
- * 通过一个变量进行搜索的效果*/
- // Query query = new TermQuery(new Term("desc", "工程师"));
- /**3.BooleanQuery 布尔搜索
- * 通过组合的方式达到搜索的效果
- * */
- // BooleanQuery query = new BooleanQuery();
- // Query query1 = new TermQuery(new Term("desc","工程师"));
- // Query query2 = new TermQuery(new Term("name","石"));
- // query.add(query1, BooleanClause.Occur.SHOULD);//OR
- // query.add(query2, BooleanClause.Occur.MUST);//AND
- /**4.WildcardQuery 通配符搜索
- * 通过设置通配符,达到匹配的效果
- * */
- // WildcardQuery query = new WildcardQuery(new Term("desc", "程序*"));
- /**5.PhraseQuery 多关键字的搜索
- * setSlop()用来设定两个词之间的最大间距,
- * 例如本次搜索中石静的工程师和艺术家之间存在间隔则没有被搜索到
- * */
- // PhraseQuery query = new PhraseQuery();
- // query.add(new Term("desc","工程师"));
- // query.add(new Term("desc","艺术家"));
- // query.setSlop(3);//通过setSlop()方法来设定一个称之为“坡度”的变量来确定关键字之间是否允许、允许多少个无关词汇的存在
- /**6.PrefixQuery 前缀搜索
- * 搜索起始位置符合要求的结果,可以是关键词的一部分
- * 例如本次中之匹配java的一部分ja
- * 另外。这个可以和其他的匹配形式进行结合,例如正则表达式
- * */
- // PrefixQuery query = new PrefixQuery(new Term("desc","ja"));
- /**7.MultiPhraseQuery
- * 先指定一个前缀关键字,然后讲其他的关键字加在此关键字之后,组成词语进行搜索
- * 通俗:搜索在两个词之间,不一定完全匹配,根据匹配规则进行评分,并按顺序输出结果
- * */
- // MultiPhraseQuery query=new MultiPhraseQuery();
- // query.add(new Term[]{new Term("desc","程序设计"),new Term("desc","家")});
- /**8.FuzzyQuery
- * 模糊搜索
- * 后面为相关度,小于1的浮点小数
- *
- * 作用:这个可以在正则匹配精确匹配无法找到某些结果的时候得到正确的结果
- * 例如,本例子中的java,通过模糊匹配,匹配到了jva
- * */
- FuzzyQuery query=new FuzzyQuery(new Term("desc","java"),(float)0.1);
- /**10.NumericRangeQuery 范围查询(索引字段必须是 NumbericField)
- * 通过设定某一项,某些字段的文字或者数字的区间,进行匹配
- * 最常用的通过某些时间段获取索要搜索的内容
- * 例如在日期的获取上
- * */
- // NumericRangeQuery<Integer> query = NumericRangeQuery.newIntRange("birth", 1985, 1987, true, false);
- ScoreDoc[] hits = searcher.search(query, 10).scoreDocs;
- for (ScoreDoc scoreDoc : hits) {
- Document doc = searcher.doc(scoreDoc.doc);
- System.out.println(scoreDoc.score + "\\tid:" + doc.get("id") + "\\tname:" + doc.get("name") + "\\tbirth:" + doc.get("birth") + "\\tdesc:" + doc.get("desc"));
- }
- }
- static String[] data = new String[]{
- "201204020|小宋|1988|算法分析师工程师,程序厉害",
- "201204021|朱波|1988|并行设计师工程师,文学家",
- "201204022|孙琳琳|1988|测试工程师设计师",
- "201204023|崔涣|1989|java程序员工程师设计师",
- "201204024|李彤阳|1986|C++程序员工程师",
- "201204025|牟晓伟|1985|C++程序员工程师设计师",
- "201204026|石小静|1988|jva嵌入式工程师设计师,艺术家",
- "201204027|石静|1988|测试工程师设计师",
- "201204028|乔婷婷|1988|人工智能工程师艺术家",
- "201204029|朱凯敏|1988|c++程序员工程师"
- };
- public static void main(String[] args) throws Exception {
- index();
- testQuery();
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/3010201410841.html
来源: http://www.codesnippet.cn/detail/3010201410841.html