MultiTermQuery包含以下query:
FuzzyQuery, NumericRangeQuery, PrefixQuery, TermRangeQuery, WildcardQuery
FuzzyQuery是一种模糊查询,它可以简单地识别两个相近的词语。 即相似度匹配
NumericRangeQuery数字形式的范围查询
PrefixQuery前缀搜索A Query that matches documents containing terms with a specified prefix. A PrefixQuery is built by QueryParser for input like app*.
TermRangeQuery:主要用于文本范围查找;
使用通配符查询,*代表0个或多个字母,?代表0个或1个字母。
Query query=new WildcardQuery(new Term("contents","?ild*"));
Hits hits=searcher.search(query);
使用QueryParser和wildcardQuery使用的是相同的语法。但使用QueryParser时,首个字母不能是通配符
SpanQuery按照词在文章中的距离或者查询几个相邻词的查询
SpanQuery包括以下几种:
SpanTermQuery:词距查询的基础,结果和TermQuery相似,只不过是增加了查询结果中单词的距离信息。
SpanFirstQuery:在指定距离可以找到第一个单词的查询。
SpanNearQuery:查询的几个语句之间保持者一定的距离。
SpanOrQuery:同时查询几个词句查询。
SpanNotQuery:从一个词距查询结果中,去除一个词距查询。
ConstantScoreQuery
A query that wraps a filter and simply returns a constant score equal to the query boost for every document in the filter
看了一下这个类的构造函数ConstantScoreQuery(Filter filter) ,我的理解就是通过构造filter来完成文档的过滤,并且返回一个复合当前过滤条件的文档的常量分数,这个分数等于为查询条件设置的boost
2、自定义评分一、根据文件大小来评分,文件越大,权重越低
- package util;
- import java.io.IOException;
- import org.apache.lucene.index.IndexReader;
- import org.apache.lucene.index.Term;
- import org.apache.lucene.search.IndexSearcher;
- import org.apache.lucene.search.Query;
- import org.apache.lucene.search.TermQuery;
- import org.apache.lucene.search.TopDocs;
- import org.apache.lucene.search.function.CustomScoreProvider;
- import org.apache.lucene.search.function.CustomScoreQuery;
- import org.apache.lucene.search.function.FieldScoreQuery;
- import org.apache.lucene.search.function.ValueSourceQuery;
- import org.apache.lucene.search.function.FieldScoreQuery.Type;
- public class MyScoreQuery1{
- public void searchByScoreQuery() throws Exception{
- IndexSearcher searcher = DocUtil.getSearcher();
- Query query = new TermQuery(new Term("content","java"));
- //1、创建评分域,如果Type是String类型,那么是Type.BYTE
- //该域必须是数值型的,并且不能使用norms索引,以及每个文档中该域只能由一个语汇
- //单元,通常可用Field.Index.not_analyzer_no_norms来进行创建索引
- FieldScoreQuery fieldScoreQuery = new FieldScoreQuery("size",Type.INT);
- //2、根据评分域和原有的Query创建自定义的Query对象
- //query是原有的query,fieldScoreQuery是专门做评分的query
- MyCustomScoreQuery customQuery = new MyCustomScoreQuery(query, fieldScoreQuery);
- TopDocs topdoc = searcher.search(customQuery, 100);
- DocUtil.printDocument(topdoc, searcher);
- searcher.close();
- }
- @SuppressWarnings("serial")
- private class MyCustomScoreQuery extends CustomScoreQuery{
- public MyCustomScoreQuery(Query subQuery, ValueSourceQuery valSrcQuery) {
- super(subQuery, valSrcQuery);
- }
- /**
- * 这里的reader是针对段的,意思是如果索引包含的段不止一个,那么搜索期间会多次调用
- * 这个方法,强调这点是重要的,因为它使你的评分逻辑能够有效使用段reader来对域缓存
- * 中的值进行检索
- */
- @Override
- protected CustomScoreProvider getCustomScoreProvider(IndexReader reader)
- throws IOException {
- //默认情况实现的评分是通过原有的评分*传入进来的评分域所获取的评分来确定最终打分的
- //为了根据不同的需求进行评分,需要自己进行评分的设定
- /**
- * 自定评分的步骤
- * 创建一个类继承于CustomScoreProvider
- * 覆盖customScore方法
- */
- // return super.getCustomScoreProvider(reader);
- return new MyCustomScoreProvider(reader);
- }
- }
- private class MyCustomScoreProvider extends CustomScoreProvider{
- public MyCustomScoreProvider(IndexReader reader) {
- super(reader);
- }
- /**
- * subQueryScore表示默认文档的打分
- * valSrcScore表示的评分域的打分
- * 默认是subQueryScore*valSrcScore返回的
- */
- @Override
- public float customScore(int doc, float subQueryScore, float valSrcScore)throws IOException {
- System.out.println("Doc:"+doc);
- System.out.println("subQueryScore:"+subQueryScore);
- System.out.println("valSrcScore:"+valSrcScore);
- // return super.customScore(doc, subQueryScore, valSrcScore);
- return subQueryScore / valSrcScore;
- }
- }
- }
3、根据特定的几个文件名来评分,选中的文件名权重变大
- package util;
- import java.io.IOException;
- import org.apache.lucene.index.IndexReader;
- import org.apache.lucene.index.Term;
- import org.apache.lucene.search.FieldCache;
- import org.apache.lucene.search.IndexSearcher;
- import org.apache.lucene.search.Query;
- import org.apache.lucene.search.TermQuery;
- import org.apache.lucene.search.TopDocs;
- import org.apache.lucene.search.function.CustomScoreProvider;
- import org.apache.lucene.search.function.CustomScoreQuery;
- /**
- * 此类的功能是给特定的文件名加权,也就是加评分
- * 也可以实现搜索书籍的时候把近一两年的出版的图书给增加权重
- * @author user
- */
- public class MyScoreQuery2 {
- public void searchByFileScoreQuery() throws Exception{
- IndexSearcher searcher = DocUtil.getSearcher();
- Query query = new TermQuery(new Term("content","java"));
- FilenameScoreQuery fieldScoreQuery = new FilenameScoreQuery(query);
- TopDocs topdoc = searcher.search(fieldScoreQuery, 100);
- DocUtil.printDocument(topdoc, searcher);
- searcher.close();
- }
- @SuppressWarnings("serial")
- private class FilenameScoreQuery extends CustomScoreQuery{
- public FilenameScoreQuery(Query subQuery) {
- super(subQuery);
- }
- @Override
- protected CustomScoreProvider getCustomScoreProvider(IndexReader reader)
- throws IOException {
- // return super.getCustomScoreProvider(reader);
- return new FilenameScoreProvider(reader);
- }
- }
- private class FilenameScoreProvider extends CustomScoreProvider{
- String[] filenames = null;
- public FilenameScoreProvider(IndexReader reader) {
- super(reader);
- try {
- filenames = FieldCache.DEFAULT.getStrings(reader, "filename");
- } catch (IOException e) {e.printStackTrace();}
- }
- //如何根据doc获取相应的field的值
- /*
- * 在reader没有关闭之前,所有的数据会存储要一个域缓存中,可以通过域缓存获取很多有用
- * 的信息filenames = FieldCache.DEFAULT.getStrings(reader, "filename");可以获取
- * 所有的filename域的信息
- */
- @Override
- public float customScore(int doc, float subQueryScore, float valSrcScore)
- throws IOException {
- String fileName = filenames[doc];
- System.out.println(doc+":"+fileName);
- // return super.customScore(doc, subQueryScore, valSrcScore);
- if("9.txt".equals(fileName) || "4.txt".equals(fileName)) {
- return subQueryScore*1.5f;
- }
- return subQueryScore/1.5f;
- }
- }
- }
4、测试junit
- package test;
- import org.junit.Test;
- import util.MyScoreQuery1;
- import util.MyScoreQuery2;
- public class TestCustomScore {
- @Test
- public void test01() throws Exception {
- MyScoreQuery1 msq = new MyScoreQuery1();
- msq.searchByScoreQuery();
- }
- @Test
- public void test02() throws Exception {
- MyScoreQuery2 msq = new MyScoreQuery2();
- msq.searchByFileScoreQuery();
- }
- }
5、文档操作的工具类
- package util;
- import java.io.File;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.apache.lucene.document.Document;
- import org.apache.lucene.index.CorruptIndexException;
- import org.apache.lucene.index.IndexReader;
- import org.apache.lucene.search.IndexSearcher;
- import org.apache.lucene.search.ScoreDoc;
- import org.apache.lucene.search.TopDocs;
- import org.apache.lucene.store.Directory;
- import org.apache.lucene.store.FSDirectory;
- public class DocUtil {
- private static IndexReader reader;
- //得到indexSearch对象
- public static IndexSearcher getSearcher(){
- try {
- Directory directory = FSDirectory.open(new File("D:\\Workspaces\\customscore\\index"));
- reader = IndexReader.open(directory);
- } catch (CorruptIndexException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- IndexSearcher searcher = new IndexSearcher(reader);
- return searcher;
- }
- /**
- * 打印文档信息
- * @param topdoc
- */
- public static void printDocument(TopDocs topdoc,IndexSearcher searcher){
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
- for(ScoreDoc scoredoc : topdoc.scoreDocs){
- try {
- Document doc = searcher.doc(scoredoc.doc);
- System.out.println(scoredoc.doc+":("+scoredoc.score+")" +
- "["+doc.get("filename")+"【"+doc.get("path")+"】--->"+
- doc.get("size")+"-----"+sdf.format(new Date(Long.valueOf(doc.get("date"))))+"]");
- } catch (CorruptIndexException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
6、创建索引
- package index;
- import java.io.File;
- import java.io.IOException;
- import org.apache.commons.io.FileUtils;
- 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.CorruptIndexException;
- import org.apache.lucene.index.IndexWriter;
- import org.apache.lucene.index.IndexWriterConfig;
- import org.apache.lucene.store.Directory;
- import org.apache.lucene.store.FSDirectory;
- import org.apache.lucene.store.LockObtainFailedException;
- import org.apache.lucene.util.Version;
- import org.wltea.analyzer.lucene.IKAnalyzer;
- public class FileIndexUtils {
- private static Directory directory = null;
- private static Analyzer analyzer = new IKAnalyzer();
- public static void main(String[] args) {
- index(true);
- }
- static{
- try {
- directory = FSDirectory.open(new File("D:\\Workspaces\\customscore\\index"));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static Directory getDirectory() {
- return directory;
- }
- public static void index(boolean hasNew) {
- IndexWriter writer = null;
- try {
- writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, analyzer));
- if(hasNew) {
- writer.deleteAll();
- }
- File file = new File("D:\\Workspaces\\customscore\\resource");
- Document doc = null;
- for(File f:file.listFiles()) {
- doc = new Document();
- doc.add(new Field("content",FileUtils.readFileToString(f),Field.Store.YES,Field.Index.ANALYZED));
- doc.add(new Field("filename",f.getName(),Field.Store.YES,Field.Index.ANALYZED));
- doc.add(new Field("classid","5312",Field.Store.YES,Field.Index.ANALYZED));
- doc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.ANALYZED));
- doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(f.lastModified()));
- doc.add(new NumericField("size",Field.Store.YES,true).setIntValue((int)(f.length())));
- writer.addDocument(doc);
- }
- } catch (CorruptIndexException e) {
- e.printStackTrace();
- } catch (LockObtainFailedException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- if(writer!=null) writer.close();
- } catch (CorruptIndexException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
工程下载路径:http://download.csdn.net/detail/wxwzy738/5320772
http://blog.csdn.net/wxwzy738/article/details/8873094
相关推荐
**三、应用实例** 在实际应用中,可以使用以下步骤配置和使用Lucene5的SpellCheck功能: 1. 创建索引:首先,需要为要搜索的文档建立一个标准的Lucene索引。 2. 构建SpellChecker对象:使用IndexDictionary和Spell...
创建了三个文档,每个文档包含一个`Field`对象,用于存储URL地址。这些文档将被添加到索引中。 3. **执行正则表达式查询**: ```java String regex = "http://[a-z]{1,3}\\.abc\\.com/.*"; Term t = new Term("url...
public void add(Query query, BooleanClause.Occur occur) BooleanClause用于表示布尔查询子句关系的类,包括: BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。 有以下6...
`FuzzyQuery`构造函数接受三个参数:`queryTerm`,模糊查询的相似度阈值(默认是0.5,表示至少50%的相似度),以及前缀长度(默认是0,表示可以接受任何前缀)。 相似度阈值决定了返回结果的最低相似度,而前缀长度...
在提供的资源中,“Lucene各种jar包”包含了开发Lucene应用所需的基础组件。 1. **Lucene Core**: 这是Lucene的核心库,包含了索引和搜索的基本功能。例如,`IndexWriter`用于创建和更新索引,`Directory`用于存储...
三、SpanQuery和PhraseQuery的区别 虽然 SpanQuery 和 PhraseQuery 都可以用于查询指定字段中包含某些词项的文档,但是它们有着不同的实现机制和用途。 SpanQuery 主要用于查询指定字段中包含某些词项的文档,并且...
Lucene是一款功能强大且高效的搜索引擎,广泛应用于各种搜索应用程序中。为了更好地使用Lucene,需要了解其核心API和常用代码。本文将对Lucene部分常用代码进行详细解释,包括多字段搜索、多条件搜索、过滤等。 多...
Lucene的核心架构主要分为三个部分:索引(Indexing)、查询(Query)和搜索(Searching)。首先,索引过程将原始文档转换为倒排索引(Inverted Index),这是一个经过优化的数据结构,便于快速查找包含特定词项的...
Lucene是一款开源的全文搜索引擎库,由Apache软件基金会维护,被广泛应用于各种搜索引擎的开发。它提供了一个高效、可扩展的框架,用于索引和搜索大量文本数据。本篇文章将深入探讨如何基于Lucene开发一个文件检索...
Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...
Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被广泛应用于各种信息检索系统。这本书面向对Java编程和信息检索感兴趣的开发者,通过详尽的注释和分析,使读者能够深入掌握Lucene的内部机制。 首先,...
**三、Lucene的扩展与应用** 除了基本的搜索功能,Lucene还有许多扩展和周边工具,例如Solr和Elasticsearch,它们为Lucene提供了一个更易于部署和管理的服务器环境,支持分布式搜索和更高级的特性,如自动完成、...
在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...
3. 查询(Query):用户查询被转换成 Lucene Query 对象,如TermQuery、BooleanQuery等。这些查询对象与索引交互,寻找匹配的文档。解析查询字符串的类,如QueryParser,也是在这个阶段发挥作用。 4. 搜索(Search...
集成第三方分词器到Lucene.NET主要涉及以下几个步骤: 1. **安装分词器**:首先需要在项目中引入分词器的NuGet包或源码。 2. **配置分词器**:在Lucene.NET的索引创建阶段,需要配置Analyzer类,指定使用特定的分词...
4. **搜索索引**:通过Query对象定义搜索条件,使用Searcher对象执行搜索,并获取结果集。 5. **排序和评分**:Lucene提供TF-IDF等算法对搜索结果进行评分,可以根据评分进行排序。 6. **结果展示**:将搜索结果转换...
### 三、Lucene高级特性 1. **多字段搜索**:可以在多个字段上同时进行查询,通过`BooleanQuery`或`MultiFieldQueryParser`实现。 2. **模糊搜索**:支持通配符查询、前缀查询、正则表达式查询等。 3. **近似搜索...
Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎和站内搜索解决方案中。它提供了丰富的文本分析、索引和搜索功能,使得开发者能够轻松地在自己的应用程序中实现复杂的全文检索...
10. **应用场景**:Lucene广泛应用于各种需要全文搜索的场景,如网站搜索、日志分析、知识库检索等。 总的来说,Lucene是一个强大的文本检索工具,它简化了全文搜索的实现,让开发者可以专注于业务逻辑,而非底层的...
在搜索阶段,Lucene支持多种查询类型,如标准查询(Standard Query)、短语查询(Phrase Query)、布尔查询(Boolean Query)以及模糊查询。模糊查询允许用户输入近似或部分关键词,系统会尝试找到与之最接近的匹配...