LuceneSearchSpanQuery.java
上传用户:cctqzzy
上传日期:2022-03-14
资源大小:12198k
文件大小:8k
源码类别:

搜索引擎

开发平台:

Java

  1. package chapter6;
  2. import java.io.IOException;
  3. import org.apache.lucene.index.Term;
  4. import org.apache.lucene.document.Field;
  5. import org.apache.lucene.document.Document;
  6. import org.apache.lucene.index.IndexWriter;
  7. import org.apache.lucene.analysis.Analyzer;
  8. import org.apache.lucene.analysis.SimpleAnalyzer;
  9. import org.apache.lucene.search.Query;
  10. import org.apache.lucene.search.Hits;
  11. import org.apache.lucene.search.spans.*;
  12. import org.apache.lucene.search.IndexSearcher;
  13. import org.apache.lucene.queryParser.*;
  14. public class LuceneSearchSpanQuery {
  15. private static String Dest_Index_Path = "D:\workshop\TextIndex";
  16. static protected String[] keywords = {"001","002","003"};
  17. static protected String[] textdetail = {"记录一 记录二 记录三 记录四 记录五","记录一 记录六 记录七 记录八 记录九 记录十 记录三","记录十一 记录十二 记录十三 记录十四 记录十五"};
  18. /*================================================================
  19.  * 名 称:SpanFirstQueryTest
  20.  * 功 能:构造SpanQuery检索查询器,对指定的目录进行查询,找到指定的值,并输出相应结果。
  21.  ===============================================================*/
  22. public static void SpanFirstQueryTest(){
  23. try {
  24. IndexSearcher searcher = new IndexSearcher(Dest_Index_Path);
  25.     String searchWords = "记录四";
  26.     Term t = new Term("content",searchWords);
  27.     SpanTermQuery query = new SpanTermQuery(t);
  28.     SpanFirstQuery firstquery = new SpanFirstQuery(query,4);
  29.     
  30. System.out.println(query.toString());
  31. Hits hits = searcher.search(firstquery);
  32. System.out.println("Search result:");
  33. for(int i=0; i < hits.length(); i++)
  34. {
  35. System.out.println(hits.doc(i));
  36. System.out.println(hits.doc(i).getField("id"));
  37. }
  38. }catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. System.out.println("Search success");
  42. }
  43. /*================================================================
  44.  * 名 称:SpanNearQueryTest
  45.  * 功 能:构造SpanNearQuery检索查询器,对指定的目录进行查询,找到指定的值,
  46.  * 并输出相应结果。
  47.  ===============================================================*/
  48. public static void SpanNearQueryTest(){
  49. try {
  50. IndexSearcher searcher = new IndexSearcher(Dest_Index_Path);
  51.     Term t1 = new Term("content","记录一");
  52.     Term t2 = new Term("content","记录三");
  53.     Term t3 = new Term("content","记录四");
  54.     
  55.     SpanTermQuery query1 = new SpanTermQuery(t1);
  56.     SpanTermQuery query2 = new SpanTermQuery(t2);
  57.     SpanTermQuery query3 = new SpanTermQuery(t3);
  58.     
  59.     SpanQuery[] queryarray  = new SpanQuery[]{query1,query3};
  60.     
  61.     SpanNearQuery nearquery = new SpanNearQuery(queryarray,2,true);
  62.     
  63. System.out.println(nearquery.toString());
  64. Hits hits = searcher.search( nearquery );
  65. System.out.println("Search result:");
  66. for(int i=0; i < hits.length(); i++)
  67. {
  68. System.out.println(hits.doc(i));
  69. System.out.println(hits.doc(i).getField("id"));
  70. }
  71. }catch (IOException e) {
  72. e.printStackTrace();
  73. }
  74. System.out.println("Search success");
  75. }
  76. /*================================================================
  77.  * 名 称:SpanNotQueryTest
  78.  * 功 能:构造SpanNotQuery检索查询器,对指定的目录进行查询,找到指定的值,
  79.  * 并输出相应结果。
  80.  ===============================================================*/
  81. public static void SpanNotQueryTest(){
  82. try {
  83. IndexSearcher searcher = new IndexSearcher(Dest_Index_Path);
  84.     Term t1 = new Term("content","记录一");
  85.     Term t2 = new Term("content","记录三");
  86.     Term t3 = new Term("content","记录四");
  87.     
  88.     SpanTermQuery query1 = new SpanTermQuery(t1);
  89.     SpanTermQuery query2 = new SpanTermQuery(t2);
  90.     SpanTermQuery query3 = new SpanTermQuery(t3);
  91.     
  92.     SpanQuery[] queryarray  = new SpanQuery[]{query1,query3};
  93.     
  94.     SpanNearQuery nearquery = new SpanNearQuery(queryarray,1,true);
  95.     SpanNotQuery notquery = new SpanNotQuery(nearquery,query2);
  96.     
  97. System.out.println(notquery.toString());
  98. Hits hits = searcher.search( notquery );
  99. System.out.println("Search result:");
  100. for(int i=0; i < hits.length(); i++)
  101. {
  102. System.out.println(hits.doc(i));
  103. System.out.println(hits.doc(i).getField("id"));
  104. }
  105. }catch (IOException e) {
  106. e.printStackTrace();
  107. }
  108. System.out.println("Search success");
  109. }
  110. /*================================================================
  111.  * 名 称:SpanOrQueryTest
  112.  * 功 能:构造SpanOrQuery检索查询器,对指定的目录进行查询,找到指定的值,
  113.  * 并输出相应结果。
  114.  ===============================================================*/
  115. public static void SpanOrQueryTest(){
  116. try {
  117. IndexSearcher searcher = new IndexSearcher(Dest_Index_Path);
  118.     Term t1 = new Term("content","记录一");
  119.     Term t2 = new Term("content","记录三");
  120.     Term t3 = new Term("content","记录四");
  121.     
  122.     SpanTermQuery query1 = new SpanTermQuery(t1);
  123.     SpanTermQuery query2 = new SpanTermQuery(t2);
  124.     SpanTermQuery query3 = new SpanTermQuery(t3);
  125.     
  126.     SpanQuery[] queryarray1  = new SpanQuery[]{query1,query2};
  127.     SpanQuery[] queryarray2  = new SpanQuery[]{query2,query3};
  128.     
  129.     SpanNearQuery nearquery1 = new SpanNearQuery(queryarray1,1,true);
  130.     SpanNearQuery nearquery2 = new SpanNearQuery(queryarray2,1,true);
  131.     
  132.     SpanOrQuery orquery = new SpanOrQuery(new  SpanNearQuery[]{nearquery1,nearquery2});
  133.     
  134. System.out.println(orquery.toString());
  135. Hits hits = searcher.search( orquery );
  136. System.out.println("Search result:");
  137. for(int i=0; i < hits.length(); i++)
  138. {
  139. System.out.println(hits.doc(i));
  140. System.out.println(hits.doc(i).getField("id"));
  141. }
  142. }catch (IOException e) {
  143. e.printStackTrace();
  144. }
  145. System.out.println("Search success");
  146. }
  147. /*================================================================
  148.  * 名 称:TermQueryParserTest
  149.  * 功 能:测试QueryParser生成TermQuery对象,并利用检索查询器,对指定的目录进行查询,
  150.  * 找到指定的值,并输出相应结果。
  151.  ===============================================================*/
  152. public static void TermQueryParserTest(){
  153. try {
  154. IndexSearcher searcher = new IndexSearcher(Dest_Index_Path);
  155.     String searchWords = "记录";
  156.     Analyzer analyzer = new SimpleAnalyzer();
  157.     QueryParser parser = new QueryParser("content",analyzer); 
  158.     try{
  159.     Query query = parser.parse(searchWords);
  160. System.out.println(query.toString());
  161. System.out.println(query.getClass());
  162. Hits hits = searcher.search(query);
  163. System.out.println("Search result:");
  164. for(int i=0; i < hits.length(); i++)
  165. {
  166. System.out.println(hits.doc(i));
  167. System.out.println(hits.doc(i).getField("id"));
  168. }
  169.     
  170.     } catch(ParseException e1){
  171. e1.printStackTrace();
  172.     }
  173. }catch (IOException e) {
  174. e.printStackTrace();
  175. }
  176. System.out.println("Search success");
  177. }
  178. /*================================================================
  179.  * 名 称:SpanIndexBuilder
  180.  * 功 能:构造磁盘索引,添加内容到指定目录,为后续检索查询做好准备。
  181.  ===============================================================*/
  182. public static void SpanIndexBuilder(){
  183. try {
  184. Analyzer TextAnalyzer = new SimpleAnalyzer();
  185. IndexWriter TextIndex = new IndexWriter(Dest_Index_Path,TextAnalyzer,true);
  186.         TextIndex.setUseCompoundFile(true);
  187. for(int i = 0; i < 3 ; i++){
  188. Document document = new Document();
  189. Field field_id = new Field("id", keywords[i], 
  190. Field.Store.YES,Field.Index.UN_TOKENIZED);
  191. document.add(field_id);
  192. Field field_content = new Field("content", textdetail[i], 
  193. Field.Store.YES,Field.Index.TOKENIZED);
  194. document.add(field_content);
  195. TextIndex.addDocument(document);
  196. }
  197. TextIndex.optimize();
  198. TextIndex.close();
  199. }catch (IOException e) {
  200. e.printStackTrace();
  201. }
  202. System.out.println("Index success");
  203. }
  204. /*================================================================
  205.  * 名 称:main
  206.  * 功 能:测试Lucene索引建立和检索查询功能。
  207.  ===============================================================*/
  208. public static void main(String[] args) {
  209. SpanIndexBuilder();
  210. //SpanFirstQueryTest();
  211. //SpanNearQueryTest();
  212. //SpanNotQueryTest();
  213. SpanOrQueryTest();
  214. System.out.println("Test success");
  215. }
  216. }