Lucene学习笔记之十二:lucene几种搜索方式

2019-03-11 09:42|来源: 网路

精确匹配搜索

查出在某个域中,含有某个词的指定文档数,要用到的方法是TermQuery

public void searchByTerm(String field,String name,int num) {

   try {

      IndexSearcher searcher = getSearcher();

      Query query = new TermQuery(new Term(field,name));

      TopDocs tds = searcher.search(query,  num);

      System.out.println("一共查询了:"+tds.totalHits);

      for(ScoreDoc sd:tds.scoreDocs) {

          Document doc = searcher.doc(sd.doc);

          System.out.println(doc.get("id")+"---->"+

                 doc.get("name")+"["+doc.get("email")+

                 "]-->"+doc.get("id")+","+

                 doc.get("attach")+","+doc.get("date"));

      }

      searcher.close();

   } catch (CorruptIndexException e) {

      e.printStackTrace();

   } catch (IOException e) {

      e.printStackTrace();

   }

}

@Test

public void searchByTerm() {

   su.searchByTerm("content","football",3);

}



范围搜索

用到的方法是

Query query = new TermRangeQuery(field,start,end,true, true);

其中第四个参数如果是为true,表示包含start,否则不包含。第五个参数的意思和第四个一样,只是指定的是end

public void searchByTermRange(String field, String start, String  end,

      int num) {

   try {

      IndexSearcher searcher = getSearcher();

      Query query = new TermRangeQuery(field,  start, end, true, true);

      TopDocs tds = searcher.search(query,  num);

      System.out.println("一共查询了:" + tds.totalHits);

      for (ScoreDoc sd : tds.scoreDocs) {

          Document doc = searcher.doc(sd.doc);

          System.out.println(doc.get("id") + "---->" + doc.get("name")

                 + "[" + doc.get("email") + "]-->" + doc.get("id") + ","

                 + doc.get("attach") + "," + doc.get("date"));

      }

      searcher.close();

   } catch (CorruptIndexException e) {

      e.printStackTrace();

   } catch (IOException e) {

      e.printStackTrace();

   }

}

@Test

public void searchByTermRange() {

   //查询ID13

   su.searchByTermRange("id", "1", "3", 10);

   //查询namea开头和s结尾的

   su.searchByTermRange("name","a","s",10);

   //由于attachs是数字类型,使用TermRange无法查询

   su.searchByTermRange("attach","2","10", 5);

}


数字范围,使用NumericRangeQuery方法和前面的一样,只是创建Query对象不一样:

Query query = NumericRangeQuery

.newIntRange(field,start, end,true,true);


测试示例:

public voidsearchByNumRange() {

   su.searchByNumricRange("attach",2,10,5);

}


前缀搜索

方法和前面的一样,只是创建Query对象不一样:

Query query = new PrefixQuery(new Term(field,value));

测试方法

@Test

public voidsearchByPrefix() {

   su.searchByPrefix("content","s",10);

}


通配符搜索

在传入的value中可以使用通配符:?*,?表示匹配一个字符,*表示匹配任意多个字符

Query query = new WildcardQuery(new Term(field,value));

测试方法

@Test

public voidsearchByWildcard() {

   //匹配@itat.org结尾的所有字符

   su.searchByWildcard("email","*@itat.org", 10);

   //匹配j开头的有三个字符的name

   su.searchByWildcard("name", "j???", 10);

}


多条件搜索

BooleanQuery可以连接多个子查询

Occur.MUST表示必须出现

Occur.SHOULD表示可以出现

Occur.MUSE_NOT表示不能出现


BooleanQuery query = new BooleanQuery();

query.add(new TermQuery(new Term("name","zhangsan")), Occur.MUST_NOT);

query.add(new TermQuery(new Term("content","game")),Occur.SHOULD);


本文链接:Lucene学习笔记之十二:lucene几种搜索方式,领悟书生学习笔记,转载请注明出处:http://www.656463.com/article/449

相关问答

更多
  • lucene怎么用[2022-07-03]

    Lucene是一个全文检索系统框架,开源的。 用起来比较方便,去Lucene的官网上下一个包并导入到你的工程中就可以调用包里面的类了。 一般的书里面介绍的版本都是1.4.3或者稍微高级一点的,不过现在lucene3.0正式发布,一些函数调用方法已经改变了,你可以下载一个版本低一点的Lucene比较适合学习~ 当然你直接从3.0入手的话网上资料也是非常丰富的~
  • SpanQuery是按照词在文章中的距离或者查询几个相邻词的查询。 打个比方:如“中华人民共和国” 用“中国“做为关键字, 跨度为某个值,如5。跨度代表 中 和国之间的长度。。 lucene的: SpanQuery包括以下几种: SpanTermQuery:词距查询的基础,结果和TermQuery相似,只不过是增加了查询结果中单词的距离信息。 SpanFirstQuery:在指定距离可以找到第一个单词的查询。 SpanNearQuery:查询的几个语句之间保持者一定的距离。 SpanOrQuery:同时查询 ...
  • 如何用java实现lucene(只使用,不求甚解版-_-") 1.前提   lucene有7个包需要导入:analysis,document,index,queryParser,search,store,util    2.建立索引   IndexWriter writer = new IndexWriter("E:/index", new StandardAnalyze(),true,MaxFieldLength.UNLIMITED); //true代表覆盖原先数据,maxFieldLength用来限制F ...
  • 可以使用PhraseQuery ,如: PhraseQuery query = new PhraseQuery(); query.setSlop(0); query.add(new Term("contents",“故障”)); //contents为索引搜索字段名 query.add(new Term("contents",“原”)); query.add(new Term("contents",“因”)); TopDocs topDocs = searcher.search(query, 10);
  • 这不是很简单的问题?把HTML目录设置成lucene的索引目录,再用程序读出HTML文件代码,再索引HTML文件内容
  • 基于Java的全文检索引擎. 参考资料: Apache: Lucene Project http://jakarta.apache.org/lucene/ Lucene开发/用户邮件列表归档 Lucene-dev@jakarta.apache.org Lucene-user@jakarta.apache.org The Lucene search engine: Powerful, flexible, and free http://www.javaworld.com/javaworld/jw-09-200 ...
  • 您可以使用WildCardQuery ,因为单词expense包含在所有四个文档中,因此您可以将搜索字符串作为*expense*传递,这将返回name字段中具有费用的所有文档。 不要忘记设置QueryParser以允许带有以下内容的前导通配符: QueryParser.setAllowLeadingWildcard(true) 在代码中进行以下更改: nameQParser.setAllowLeadingWildcard(true); Query query = nameQParser.parse("*e ...
  • 在更新安装期间,系统管理员已在服务器配置中指定了Lucene索引的相对路径 ,然后启动应用服务器。 首次启动后,我们的应用程序在数据库中对数据进行完全索引,然后每两小时增加一次索引。 我们的服务器每晚都通过chron任务重启,因此在自动重启后, Lucene索引的相对路径会发生变化 。 下一个增量索引在不同文件夹中创建新索引文件并保存更改。 当我向系统管理员询问索引文件时,他们给我第一个创建的大索引,我将对它们进行分析,但实际上,服务器使用不同的索引文件。 所以,答案是:需要指定Lucene索引文件夹的完整 ...
  • 分析器旨在将字符串拆分为标记。 SmartChineseAnalyzer将“和试天下”分为“和”,“试”和“天下”,就像StandardAnalyzer将“谁获得世界”分为“谁”,“获取”和“世界”一样。 如果你想搜索一个短语,你的查询应该引用: qp.parse("\"且试天下\""); 如果您不希望分析该字段,请将其索引为StringField (或使用KeywordAnalyzer )。 Analyzers are intended to split strings into tokens. The ...
  • Java中的最高整数相当高,您可以使用Integer.MAX_VALUE作为限制。 在实际达到2 ^ 31-1(2,147,483,647)个文件的限制之前,我打赌其他东西会中断。 :-) 或者,您可以使用HitCollector : search(Query query, HitCollector results)或search(Query query, Filter filter, HitCollector results) ; 文档说: 应用程序只应在需要所有匹配文档时使用 The highest i ...