lucene-查询query->WildcardQuery使用通配符搜索

Lucene也提供了通配符的查询,这就是WildcardQuery。

package ch11;

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.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.WildcardQuery;

public class WildcardQueryTest {

     public static void main(String[] args) throws Exception {

         //生成Document对象,下同

         Document doc1 = new Document();

         //添加“content”字段的内容,下同

         doc1.add(Field.Text("content", "whatever"));

         //添加“title”字段的内容,下同

         doc1.add(Field.Keyword("title", "doc1"));

         Document doc2 = new Document();

         doc2.add(Field.Text("content", "whoever"));

         doc2.add(Field.Keyword("title", "doc2"));

         Document doc3 = new Document();

         doc3.add(Field.Text("content", "however"));

         doc3.add(Field.Keyword("title", "doc3"));

         Document doc4 = new Document();

         doc4.add(Field.Text("content", "everest"));

         doc4.add(Field.Keyword("title", "doc4"));

         //生成索引书写器

         IndexWriter writer = new IndexWriter("c://index",

                 new StandardAnalyzer(), true);

         //将文档对象添加到索引中

         writer.addDocument(doc1);

         writer.addDocument(doc2);

         writer.addDocument(doc3);

         writer.addDocument(doc4);

         //关闭索引书写器

         writer.close();

         //生成索引书写器

         IndexSearcher searcher = new IndexSearcher("c://index");

         //构造词条

         Term word1 = new Term("content", "*ever");

         Term word2 = new Term("content", "wh?ever");

         Term word3 = new Term("content", "h??ever");

         Term word4 = new Term("content", "ever*");

         //生成WildcardQuery对象,初始化为null

         WildcardQuery query = null;

         //用于保存检索结果

         Hits hits = null;

         query = new WildcardQuery(word1);

         //开始第一次检索,并返回检索结果

         hits = searcher.search(query);

         //输出检索结果的相关信息

         printResult(hits, "*ever");

         query = new WildcardQuery(word2);

         //开始第二次检索,并返回检索结果

         hits = searcher.search(query);

         //输出检索结果的相关信息

         printResult(hits, "wh?ever");

         query = new WildcardQuery(word3);

         //开始第三次检索,并返回检索结果

         hits = searcher.search(query);

         //输出检索结果的相关信息

         printResult(hits, "h??ever");

         query = new WildcardQuery(word4);

         //开始第四次检索,并返回检索结果

         hits = searcher.search(query);

         //输出检索结果的相关信息

         printResult(hits, "ever*");

     }

     public static void printResult(Hits hits, String key) throws Exception

         {System.out.println("查找 /"" + key + "/" :");

         if (hits != null) {

             if (hits.length() == 0) {

                 System.out.println("没有找到任何结果");

                 System.out.println();

             } else {

                 System.out.print("找到");

                 for (int i = 0; i < hits.length(); i++) {

                     //取得文档对象

                     Document d = hits.doc(i);

                     //取得“title”字段的内容

                     String dname = d.get("title");

                     System.out.print(dname + "   ");

                 }

                 System.out.println();

                 System.out.println();

             }

         }

     }

}

由上述代码可以看出,通配符“?”代表1个字符,而“*”则代表0至多个字符。不过通配符检索和上面的FuzzyQuery由于需要对字段关键字进行字符串匹配,所以,在搜索的性能上面会受到一些影响。

时间: 2024-10-21 22:46:33

lucene-查询query->WildcardQuery使用通配符搜索的相关文章

Lucene 查询(Query)子类

QueryParser(单域查询) QueryParser子类对单个域查询时创建查询query,构造方法中需要传入Lucene版本号,检索域名和分词器. QueryParser parser = new QueryParser(Version.LUCENE_43, field, analyzer);// 查询字符串 Query query = parser.parse("key"); MultiFieldQueryParser(多域查询) MultiFieldQueryParser p

lucene 查询的使用

各种查询 方式一:使用QueryParser与查询语法.(会使用分词器) MultiFieldQueryParser 查询字符串 ------------------------> Query对象 例如: 上海 AND 天气 上海 OR 天气 上海新闻 AND site:news.163.com ... 方式二: 直接创建Query的实例(子类的),不会使用分词器 new TermQuery(..); new BooleanQuery(..); 1 package cn.itcast.i_que

lucene查询解析器语法

Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Query Parser提供的强大的查询语法解析来构造你想要的查询器.本文章详细的介绍了Lucene的查询语法.通过Java语法分析器把一个查询字符串解析成 Lucene的查询器.在你选择使用Query Parser前,请考虑以下事项: 如果你打算在程序中拼接查询语法串然后再利用Query Parser转换,那么强烈建议你利用相应的API来自己构造查询器.也就是说,Query Parser是为手工输入高级查询设计的,而不是为

Lucene查询方式总结

-------------------------------------------------- IndexReader的设计 -------------------------------------------------- IndexReader的创建需要消耗大量内存空间, 所以通过将IndexReader设计出属性值,进行一次创建 整个项目周期就只有一个IndexReader 1.// IndexReader的设计 private static IndexReader reader

Lucene学习:lucene查询

1.1. Lucene查询 在学习Lucene的查询方法前,先了解一下下面几个类: 1.1.1. Query 封装某种查询类型的具体子类,配置查询的查询条件.Query实例将被传递给IndexSearcher的search方法.下面是常用的Query子类: l 通过项进行搜索 TermQuery类 l 在指定的项范围内搜索 TermRangeQuery类 l 通过字符串搜索 PrefixQuery类 l 组合查询 BooleanQuery类 l 通过短语搜索 PhraseQuery类 l 通配符

Lucene查询语法详解

Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 词语查询(Terms) 单词,例如:"test","hello" 语句,例如:"hello,world!" 字段查询(Field) title:hello 或者 title:"hello title" //搜索title为 hello title关键字的文档 title:hello title //搜索title为hello,或者

Lucene 查询分页技术

常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 1 public String matchAll(String path) { 2 try { 3 Directory directory = FSDirectory.open(new File(path)); 4 DirectoryReader reader = DirectoryReader.open(directory); 5 IndexSearcher searcher = new IndexSearc

Lucene系列:(7)搜索关键字高亮

在搜索结果中,将与关健字相同的字符用红色显示 TestHighlighter.java package com.rk.lucene.d_highlighter; import java.util.ArrayList; import java.util.List; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.query

Lucene系列:(8)搜索结果摘要

如果搜索结果内容太多,我们只想显示前几个字符, 必须与高亮一起使用 TestFragment.java package com.rk.lucene.e_fragment; import java.util.ArrayList; import java.util.List; import org.apache.lucene.document.Document; import org.apache.lucene.queryParser.QueryParser; import org.apache.l

Lucene系列:(9)搜索结果排序

1.什么是搜索结果排序 搜索结果是按某个或某些字段高低排序来显示的结果 2.影响网站排名的多种因素 head/meta/ 网页的标签整洁 网页执行速度 采用div+css ...... 3.Lucene中的显示结果次序与相关度得分有关     ScoreDoc.score; 默认情况下,Lucene是按相关度得分排序的,得分高排在前,得分低排在后 如果相关度得分相同,按插入索引库的先后次序排序 4.Lucene中的手工设置相关度得分 IndexWriter indexWriter = new I