首先为QUERY设置一个上届和一个下届,然后设置一个布尔值,布尔值表示,如果为TRUE,那么这两个临界值加入到结果中,如果为FALSE那么就不加到结果中。在RangeQuery判断某个TERM是否在某一范围内时,使用的是STRING的toString方法。
由于该类的rewrite方法将对某个范围内的查询转化为一个由多个TERMQUERY组成的布尔查询,而且每个子查询的条件都为SHOULD,所以查询满足的条件文档较大的时候,性能非常的低。
LUCENE提供了一种模糊搜索的机制。
IndexSearcher search = new IndexSearcher("d://demo");
Term term1 = new Term("bookname","work");
FuzzyQuery query = new FuzzyQuery(term1,0.1f,1);
Hits hits = search.search(query);
注释:首先构建了一个TERM,并将其作为FuzzyQuery的构造函数,对于FuzzyQuery有两个构造函数,
public FuzzyQuery(Term term,float minimumSimilarity) throws
IllegalArgumentException
public FuzzyQuery(Term term,float minimumSimilarity,int prefixLength) throws
IllegalArgumentException
minimumSimilarity表示是最小相似度,可以通过指定一个相似度来决定模糊匹配的严格程度。默认为0.5,当这个值越小,通过模糊查找出的文档的匹配程度就越低,文档的数量也就越多;当这个值越大,说明要匹配程度更大,匹配的文档数也就越少,当相似度设置为1,那么就退化为TermQuery查询,所以当这个值>=1或<0会抛出IllegalArgumentException异常。
另外一个参数prefixLength表示在进行模糊匹配的时候,要有多少个前缀字母必须完全匹配。例如当该值设置为“1”,则表示所有此条只有第一个字母与检索关键字相符时,才会被集合选中。
以上程序设置相似度为0.1f,并且匹配第一个字母相符的检索结果。
前缀搜索:
PrefixQuery是一种前缀搜索,在检索的时候,常常需要进行某种前缀查找,例如到图书馆查找一本书,可能只能记得书名的前面几个字,这种情况就可以用该种搜索模式。
IndexSearcher search = new IndexSearcher("d://demo");
Term term = new Term("bookname","钢");
PrefixQuery query = new PrefixQuery(term);
Hits hits = search.search(query);
这种查询方式可能比较慢
短语搜索:
用户在搜索的时候,更多的情况是输入一个以上的关键字,这些关键字和可能组成一个短语。
IndexSearcher search = new IndexSearcher("d://demo");
PhraseQuery query = new PhraseQuery();
Term term1 = new Term("bookname","钢");
Term term2 = new Term("bookname","铁");
query.add(term1);
query.add(term2);
query.setSlop(2);
Hits hits = search.search(query);
搜索结果都是钢和铁两字相连,而且顺序也一致的文档,即严格包含有“钢铁”这个短语的文档。
但是有时候用户会经常的输漏一个字或是多输入一个字,比如“钢或铁”等。
该类提供了一个setSlop(int num)的方式,表示设置坡度,它用于表示词组的两个字间可以插入无关字数的个数。
这个坡度默认值为0,在默认情况下,它将只给出那些严格匹配短语的文档作为查询结果。比如例子中设置的是2,那么表示在钢铁这两个字之间可以插入2个无关的字。
多短语搜索:
短语搜索解决了短语搜索的问题,在很多情况下,用户输入某个关键字时,该关键字可以喝多种单字组成短语,例如,用户输入一个“声”字。它可以和“声音”,“声明”等字组成短语。LUCENE提供了MultiPhraseQuery来进行多短语搜索。
IndexSearcher search = new IndexSearcher("d://demo");
MultiPhraseQuery query = new MultiPhraseQuery();
Term term1 = new Term("bookname","钢");
Term term3 = new Term("bookname","和");
query.add(new Term[]{term1,term3});
Term term2 = new Term("bookname","铁");
Term term4 = new Term("bookname","要");
query.add(new Term[]{term2,term4});
Hits hits = search.search(query);
注释:该程序定义的是以“钢”和“和”开头的字,并且可以组合“铁”和“要”的短语。
在该类中同样可以使用坡度的方法。
对搜索结果排序:
前面介绍完查询以后,现在要对查询结果进行排序的显示。
IndexSearcher search = new IndexSearcher("d://demo");
String field = "bookname";
String queryStr = "钢铁";
QueryParser parser = new QueryParser(field, new StandardAnalyzer());
Query q = parser.parse(queryStr);
//上面的查询是通过QueryParser来查询,下面通过SORT来进行排序,排序规则是首先根据bookNumber来排序,然后再根据publishdate来排序,第二个参数表示该字段是什么类型,第三个字段表示排列顺序(FALSH:升序,TRUE:降序)
Sort sort = new Sort();
SortField f1 = new SortField("bookNumber", SortField.INT, false);
SortField f2 = new SortField("publishdate", SortField.STRING, false);
sort.setSort(new SortField[] { f1, f2 });
//如果指定多个FIELD来进行排序,就把多个FIELD组合成数据塞到SORT中
Hits hits = search.search(q, sort);
SortField提供的FIELD的类型:string,int,float.指定FIELD的类型对排序过程的效率有巨大的影响。
在结果中搜索:
//在搜索oldqw的结果集中搜索qw.
public static void searchInResult(String qw, String oldqw) throws ParseException, IOException {
QueryParser queryParser = new QueryParser("content",new SimpleAnalyzer());
Query query = queryParser.parse(qw.trim());
Query oldQuery = queryParser.parse(oldqw.trim());
QueryFilter oldFilter = new QueryFilter(oldQuery);
CachingWrapperFilter filter = new CachingWrapperFilter(oldFilter);
search(query, filter);
}
private static void search(Query query, Filter filter) throws IOException, ParseException {
IndexSearcher ins = new IndexSearcher("d:/tesindex");
Hits hits = ins.search(query, filter);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.println(doc.get("content"));
}
System.out.println();
}
//首先通过搜素查询0001-0004的结果
Term begin = new Term("bookNumber", "0001");
Term end = new Term("bookNumber", "0004");
RangeQuery q = new RangeQuery(begin, end, true);
//通过将该查询的QUERY放置到 QueryFilter中
QueryFilter filter = new QueryFilter(q);
//再制定
Term normal = new Term("securitylevel",2+"");
IndexSearcher searcher = new IndexSearcher("d://demo");
TermQuery query = new TermQuery(normal);
System.out.println(q.toString());
Hits hits = searcher.search(query,filter);//制定查询的时候,将过滤器配置进行,这样相当于在0001-0004
的结果中找securitylevel=2的结果信息
对结果高亮显示:
public List collect(SearchArgs args, Hits hits, Query query)
{
try {
int[] postIds = new int[Math.min(args.fetchCount(), hits.length())];
for (int docIndex = args.startFrom(), i = 0;
docIndex < args.startFrom() + args.fetchCount() && docIndex < hits.length();
docIndex++, i++) {
Document doc = hits.doc(docIndex);
postIds[i] = Integer.parseInt(doc.get(SearchFields.Keyword.POST_ID));
}
return this.retrieveRealPosts(postIds, query);
}
catch (Exception e) {
throw new ForumException(e.toString(), e);
}
}
private List retrieveRealPosts(int[] postIds, Query query) throws IOException
{
List posts = DataAccessDriver.getInstance().newLuceneDAO().getPostsData(postIds);
for (Iterator iter = posts.iterator(); iter.hasNext(); ) {
Post post = (Post)iter.next();
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(scorer);
TokenStream tokenStream = this.settings.analyzer().tokenStream(
SearchFields.Indexed.CONTENTS, new StringReader(post.getText()));
String fragment = highlighter.getBestFragment(tokenStream, post.getText());
post.setText(fragment != null ? fragment : post.getText());
}
return posts;
}
相关推荐
“Lucene 搜索方法(多短语搜索)”这一标题指出我们要讨论的是如何在Lucene中执行多短语搜索。Lucene是一个高性能、全文本搜索库,它提供了一个强大的文本检索框架,使得开发者能够为他们的应用程序添加高级搜索...
标题"Lucene 搜索方法(布尔搜索)"指出了我们要讨论的是在Lucene中如何使用布尔查询进行文本检索。Lucene是一个高性能、全文本搜索库,它提供了强大的信息检索功能,而布尔搜索是其中一种常用且灵活的搜索方式,...
在IT领域,搜索引擎技术是不可或缺的一部分,而Apache Lucene是一个高性能、全文本搜索库,它为开发者提供了构建自定义搜索引擎应用程序所需的所有工具。本篇我们将深入探讨如何在Lucene中实现模糊搜索,以及相关的...
本文将聚焦于Lucene中的短语搜索,一种能精确匹配多个词汇顺序的搜索方法。通过分析和实践`DemoData.java`和`PhraseQueryDemo.java`这两个示例代码,我们将深入探讨这一主题。 首先,短语搜索是Lucene中的一种高级...
在IT领域,Lucene是一个广泛使用的全文搜索引擎库,它提供了高效、可扩展的搜索功能。在本主题中,我们将深入探讨如何在Lucene中实现前缀搜索,这是一种允许用户通过输入一个词的前缀来查找匹配文档的强大工具。这...
《Lucene搜索引擎与Compass框架详解》 在信息化飞速发展的今天,搜索引擎已经成为了我们获取信息的重要工具。Apache Lucene是一个高性能、全文本检索库,它提供了基础的索引和搜索功能,使得开发者能够轻松地在应用...
**正文** ...总结,利用Lucene搜索中文PDF文档涉及多个技术层面,包括中文分词、PDF解析、索引构建、搜索执行和性能优化。通过理解这些关键技术,开发者可以构建出高效、准确的中文PDF文档检索系统。
**Lucene 高级搜索项目概述** Lucene 是一个高性能、全文检索库,它提供了文本分析、索引和搜索功能,被广泛应用于各种搜索引擎的构建。在这个“Lucene 高级搜索项目”中,我们将深入探讨如何利用Lucene实现附件...
2. **创建索引**:索引是Lucene搜索的核心。我们需要定义一个Analyzer(分析器)来处理文本,如使用StandardAnalyzer进行英文分词。然后,使用Directory(目录)对象(如FSDirectory)指定存储索引的位置,最后使用...
Lucene是Apache软件基金会的一个开放源代码项目,它是一个高性能、全文本检索库,提供了Java API,可以被嵌入到各种应用程序中,实现高效的全文搜索功能。Lucene具有高度可配置性和可扩展性,适用于处理大量文本数据...
**基于Lucene搜索引擎的Java源码详解** Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。此Java源码包提供了一个全面的示例,展示了如何利用Lucene进行索引创建、更新(增量索引)以及搜索操作。...
搜索引擎是互联网信息检索的重要工具,随着互联网信息量的激增,搜索引擎的技术也在不断进步。文章主要研究和应用了...它为构建高性能的搜索引擎提供了强大的工具和方法,对于信息检索领域的发展有着重要的推动作用。
**Lucene实现企业搜索实例** 在企业环境中,高效、精准的搜索能力是至关重要的,它可以帮助员工快速定位信息,提高工作效率。Apache Lucene是一个开源的全文检索库,它提供了强大的文本搜索功能,能够帮助企业构建...
Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...
本文将深入探讨Lucene搜索引擎的配置过程,包括文件加载、索引创建和搜索操作,帮助你理解其核心技术。 ### 文件加载 在Lucene中,首先需要将待搜索的数据加载到内存或磁盘上的某个结构中。这通常涉及到读取各种...
这种方法广泛应用于各种场景,如搜索引擎、文档管理系统、知识库查询等。全文检索与数据库中的LIKE关键字查询不同,LIKE虽然能进行模糊匹配,但其结果可能不准确,没有相关度排序,且效率较低。 【Lucene简介】 ...
### 基于Lucene的搜索策略研究 随着信息技术的发展和社会信息化程度的加深,人们面临着海量数据的管理和检索挑战。如何高效地从大量的文档中找到所需的信息成为了亟待解决的问题。在这种背景下,Lucene作为一种开源...
理解Lucene和Heritrix的工作原理和使用方法,以及如何将两者结合构建有效的搜索引擎,对于完成这项工作至关重要。同时,针对垂直领域的深入理解与合理设计也是构建出有商业价值的搜索引擎的重要前提。
总之,这个基于Lucene的项目为我们提供了一种实践搜索引擎工作原理的方法。通过网页抓取、文本处理、索引创建以及搜索功能的实现,我们可以深入理解搜索引擎的核心机制,并且可以根据实际需求进行定制和优化。
**Lucene 搜索引擎实现详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一套强大的数据结构和算法,用于高效地存储和检索大量文本数据。通过 Lucene,开发者可以轻松地在自己的应用...