- 浏览: 675714 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
前面总结了很多Lucene上的东西,建立索引、高亮等等这些都是为了查询做准备和服务的,下面我们来说说查询,我们知道Lucene的主要功能就是查询功能,所以Lucene里的查询做的非常强大,可以有各种各样的查询。
org.apache.lucene.search.Query包下的Query类下有需要查询对象,这里我们说其中几个比较重要的:
TermQuery:关键字查询
TermRangeQuery:范围查询
WildcardQuery:通配符查询
PhraseQuery:短语查询
BooleanQuery:Boolean查询(最重要的)
FirstLucene04SearchByQuery.Java:
package com.iflytek.lucene; import java.io.File; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Filter; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; /** * @author xudongwang 2012-2-10 * * Email:xdwangiflytek@gmail.com */ public class FirstLucene04SearchByQuery { /** * 源文件路径 */ private String filePath01 = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneDatasource\\HelloLucene01.txt"; private String filePath02 = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneDatasource\\HelloLucene04.txt"; /** * 索引路径 */ private String indexPath = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneIndex"; /** * 分词器,这里我们使用默认的分词器,标准分析器(好几个,但对中文的支持都不好) */ private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35); private Directory ramDir = null; /** * 搜索 * * @param queryStr * 搜索的关键词 * @throws Exception */ public void search(String queryStr) throws Exception { // 1、把要搜索的文本解析为Query对象 String[] fields = { "name", "content" }; QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_35, fields, analyzer); Query query = queryParser.parse(queryStr); search(query); } /** * 搜索 * * @param query * Query对象 * @throws Exception */ public void search(Query query) throws Exception { // 2、进行查询 IndexReader indexReader = IndexReader.open(ramDir); IndexSearcher indexSearcher = new IndexSearcher(indexReader); Filter filter = null; TopDocs topDocs = indexSearcher.search(query, filter, 10000); System.out.println("总共有【" + topDocs.totalHits + "】条匹配的结果");// 注意这里的匹配结果是指文档的个数,而不是文档中包含搜索结果的个数 // 3、取出数据,并打印结果 for (ScoreDoc scoreDoc : topDocs.scoreDocs) { int docSn = scoreDoc.doc;// 文档内部编号 Document document = indexSearcher.doc(docSn);// 根据文档编号取出相应的文档 File2Document.printDocumentInfo(document);// 打印出文档信息 } } /** * 优化创建索引,将索引存在在内存和磁盘配合使用 * * @throws Exception */ public void createIndexByYouHua() throws Exception { File indexFile = new File(indexPath); Directory fsDir = FSDirectory.open(indexFile); // 1、启动时,将磁盘中的索引读取到内存中 ramDir = new RAMDirectory(fsDir); IndexWriterConfig ramConf = new IndexWriterConfig(Version.LUCENE_35, analyzer); // 运行程序时操作内存中的索引 IndexWriter ramIndexWriter = new IndexWriter(ramDir, ramConf); Document document = File2Document.file2Document(filePath01); Document document2 = File2Document.file2Document(filePath02); ramIndexWriter.addDocument(document); ramIndexWriter.addDocument(document2); ramIndexWriter.close(); // 2、退出时将内存中的索引保存到磁盘中 IndexWriterConfig fsConf = new IndexWriterConfig(Version.LUCENE_35, analyzer); IndexWriter fsIndexWriter = new IndexWriter(fsDir, fsConf); fsIndexWriter.addIndexes(ramDir);// 把另外几个索引库中的所有索引数据合并到当前的索引库中 fsIndexWriter.commit(); //fsIndexWriter.optimize();// 对索引文件进行优化,从而减少IO操作 fsIndexWriter.forceMerge(1); fsIndexWriter.close(); } public static void main(String[] args) throws Exception { FirstLucene04SearchByQuery lucene = new FirstLucene04SearchByQuery(); //lucene.createIndexByYouHua(); lucene.search("iteye"); } }
关键词查询(TermQuery):
/** * 关键字查询 * * @throws Exception */ public void testTermQuery() throws Exception { Term term = new Term("content", "iteye"); // 关键字查询,注意关键词中没有大写字符,全是小写字符 Query query = new TermQuery(term); System.out.println("对应的查询字符串:"+query); byQuery.createIndexByYouHua(); byQuery.search(query); }
运行结果:
对应的查询字符串:content:iteye 总共有【2】条匹配的结果 name -->HelloLucene01.txt content -->Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com.
path -->F:\Workspaces\workspaceSE\BlogDemo\luceneDatasource\HelloLucene01.txt size -->84 name -->HelloLucene04.txt content -->iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other.
path -->F:\Workspaces\workspaceSE\BlogDemo\luceneDatasource\HelloLucene04.txt size -->738 |
范围查询(TermRangeQuery):
/** * 范围查询 * * @throws Exception */ public void testTermRangeQuery() throws Exception { // true表示包含边界 Query query = new TermRangeQuery("size",200,900, true, true); byQuery.createIndexByYouHua(); byQuery.search(query); }
运行结果:
总共有【1】条匹配的结果 name -->HelloLucene04.txt content -->iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other.
path -->F:\Workspaces\workspaceSE\BlogDemo\luceneDatasource\HelloLucene04.txt size -->738 |
但是上面需要注意的是如果上面的范围是100-1000,则就不会有结果,这是为什么呢?
大家需要注意,这里100和1000字符串排序谁大?应该是100大,因为100的ANSIC大,所以这里它是按照字符串进行排序的,因为它在储存的时候里面全部都是字符串。这时怎么办呢?解决方法就是让索引的时候是相同的宽度,搜索的时候也是相同的宽度。
将Test里的方法改为:
public void testTermRangeQuery() throws Exception { // true表示包含边界 Query query = new TermRangeQuery("size", NumberTools.longToString(100), NumberTools.longToString(1000), true, true); byQuery.createIndexByYouHua(); byQuery.search(query); }
同时在建立索引的地方,File2Document.java中,需要将
document.add(new Field("size", String.valueOf(file.length()), Store.YES, Index.NOT_ANALYZED));
改为:
document.add(new Field("size", NumberTools.longToString(file.length()), Store.YES, Index.NOT_ANALYZED));
但是这里的方法提示过时了,在3.5中我还没找到类似的方法,知道的可以告诉我一下。
通配符查询(WildcardQuery):
/** * 通配符查询 * * '?'代表一个字符 * * '*'代表0个或多个字符 * * @throws Exception */ public void testWildcardQuery() throws Exception { // Term term = new Term("content", "itey?"); Term term = new Term("content", "ite*"); Query query = new WildcardQuery(term); byQuery.createIndexByYouHua(); byQuery.search(query); }
运行结果:
总共有【2】条匹配的结果 name -->HelloLucene01.txt content -->Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com.
path -->F:\Workspaces\workspaceSE\BlogDemo\luceneDatasource\HelloLucene01.txt size -->84 name -->HelloLucene04.txt content -->iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other. iteye too other.iteye too other.iteye too other.iteye too other.iteye too other.
path -->F:\Workspaces\workspaceSE\BlogDemo\luceneDatasource\HelloLucene04.txt size -->738 |
短语查询(PhraseQuery):
/** * 短语查询 * @throws Exception */ public void testPhraseQuery() throws Exception{ PhraseQuery phraseQuery = new PhraseQuery(); //这里的1和3是相对的位置 phraseQuery.add(new Term("content","iteye"),1); phraseQuery.add(new Term("content","address"),3); /** * phraseQuery.add(new Term("content","iteye")); phraseQuery.add(new Term("content","address")); //设置上面的两个词之间最多能隔几个词 phraseQuery.setSlop(2); */ byQuery.createIndexByYouHua(); byQuery.search(phraseQuery); }
运行结果:
总共有【1】条匹配的结果 name -->HelloLucene01.txt content -->Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com.
path -->F:\Workspaces\workspaceSE\BlogDemo\luceneDatasource\HelloLucene01.txt size -->84 |
Boolean查询(BooleanQuery):
/** * Boolean查询 * * @throws Exception */ public void testBooleanQuery() throws Exception{ //条件一 短语查询 PhraseQuery phraseQuery = new PhraseQuery(); phraseQuery.add(new Term("content","iteye"),1); phraseQuery.add(new Term("content","address"),3); //条件二 范围查询 Query query = new TermRangeQuery("size", NumberTools.longToString(100), NumberTools.longToString(1000), true, true); BooleanQuery booleanQuery = new BooleanQuery(); //条件一必须出现,条件二可能出现 booleanQuery.add(phraseQuery, Occur.MUST); booleanQuery.add(query, Occur.SHOULD); byQuery.createIndexByYouHua(); byQuery.search(booleanQuery); }
运行结果:
总共有【1】条匹配的结果 name -->HelloLucene01.txt content -->Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com.
path -->F:\Workspaces\workspaceSE\BlogDemo\luceneDatasource\HelloLucene01.txt size -->84 |
说明:
Occur用于表示布尔查询子句关系,包括:
Occur.MUST、Occur.MUST_NOT、Occur.SHOULD;
1、MUST和MUST,取得两个查询子句的交集;
2、MUST和MUST_NOT,包含MUST并且查询结果中不包含MUST_NOT的检索结果;
3、SHOULD和SHOULD,表示“或”关系,最终检索结果为所有检索子句的并集;
使用时注意:
1、MUST和SHOULD:此时SHOULD无意义,结果为MUST子句的检索结果;
2、MUST_NOT和MUST_NOT,无意义,检索无结果;
3、MUST_NOT和SHOULD,此时SHOULD相当于MUST,结果同MUST和MUST_NOT;
4、单独使用SHOULD,结果相当于MUST;
5、单独使用MUST_NOT,无意义,检索无结果;
发表评论
-
Lucene05---Highlighter
2012-02-10 21:46 1445前面讲了分词器,但是我们在搜索的时候是不是还有一个效果就 ... -
Lucene04---分词器
2012-02-04 19:12 2129我们知道,Lucene所做的事情主要就两件,一是创建索引 ... -
Lucene03---索引位置的优化(内存和磁盘配合使用)
2012-02-03 21:34 2787在前面的http://xdwangiflytek.ite ... -
Lucene02---Lucene入门与Demo
2012-02-02 23:34 4300Lucene介绍: Lucene是一个高 ... -
Lucene01---几个概念理解
2012-02-01 22:50 1811在http://xdwangiflytek.ite ... -
SEO杂谈
2012-01-31 22:49 1569以前听老师说起SEO ,过年在家走亲戚,也听说了SEO , ...
相关推荐
- 查询解析器(QueryParser):将用户输入的查询字符串转化为Lucene可以理解的查询对象。 - 搜索器(Searcher):执行查询,返回匹配的文档列表。包括IndexSearcher,用于在线搜索,以及MultiSearcher,用于同时...
"Lucene.Net-2.0-002-27Nov06.src"压缩包中的源代码提供了学习和理解Lucene.Net工作原理的宝贵资源。通过对这些源代码的阅读和研究,开发者可以深入了解其内部机制,如如何优化索引结构、如何设计高效的查询策略以及...
通过这个Demo,学习者可以了解Lucene的基本工作流程,如如何创建Document、设置Analyzer、使用IndexWriter建立索引,以及如何用QueryParser构造查询并使用Searcher进行搜索。此外,还可以学习如何评估搜索结果的...
`06_solr`文件表明项目还涉及Solr,这是一个基于Lucene的企业级搜索平台。Solr提供了更高级的服务,如分布式搜索、多租户支持、XML/JSON接口、实时添加更新等功能,使得大规模搜索应用的部署和管理更为便捷。 通过...
在实际应用中,除了这些基本操作,还需要了解其他Lucene组件,如Filter(用于进一步筛选结果)、Sort(用于结果排序)、分词器(如StandardAnalyzer、IKAnalyzer等)以及高级查询构造如BooleanQuery、PhraseQuery、...
mp4┃---02LuceneAPI介绍.mp4┃---03LuceneAPI介绍.mp4┃---04LuceneAPI介绍和IK分词器.mp4┃---05LuceneAPI介绍-复杂查询.mp4┃---06ElasticSearch介绍。mp4源码详情+=','+21720;2天学习ElasticSearch教程(3G)...
2012-06-13 13:15 3,670,884 关键词分析工具(支持批量查询).zip 2012-06-13 13:16 4,782,225 STM32F_ARM微处理器固件库说明文档.pdf 2012-06-13 13:37 5,738,216 象棋游戏.zip 2012-06-13 13:32 6,340,651 C++开发...
06-正文提取(共12页) 07-提取文件(共14页) 08-文本排重(共28页) 09-提取关键词(共16页) 10-拼写检查(共41页) 11-文本摘要(共15页) 12-文本分类(共12页) 13-文本聚类(共21页) 14-信息提取(共14页) ...
你需要掌握实体映射、查询语言HQL、 Criteria API等,理解对象关系映射原理。 【学习阶段6】Struts(39-42天): Struts是基于MVC模式的Java Web框架,用于处理HTTP请求和控制业务逻辑。学习Struts2的配置、拦截器...
│ 06.商品类目选择-分析.avi │ 08.图片服务器的分析.avi │ 09.nginx介绍.avi │ 10.项目调试方法.avi │ 11.nginx的安装及启动、停止.avi │ 12.nginx的配置文件-通过端口号区分虚拟机.avi │ 13.通过域名配置...
使用C sharp开发搜索引擎 C#搜索引擎开发实战 06-正文提取(共12页).ppt 使用C sharp开发搜索引擎 C#搜索引擎开发实战 07-提取文件(共14页).ppt 使用C sharp开发搜索引擎 C#搜索引擎开发实战 08-文本排重(共28页...
Part 05和Part 06可能会继续深化这些主题,并引入更多高级话题,例如: 11. **Hibernate的事件监听器**:允许在特定操作(如插入、更新、删除)前后执行自定义逻辑。 12. **Querydsl、JPA Criteria API**:与...
在实际项目中,开发者会结合JSP、Servlet、JDBC以及Lucene、MySQL、Oracle等技术,利用jQuery-EasyUI构建Web页面,并实现与后端的交互,如数据库分页查询。在WebRoot目录下创建HTML文件,引入EasyUI的CSS和JS文件,...
Elasticsearch 是一款基于 Apache Lucene 的开源搜索引擎,尤其在处理实时搜索应用方面表现出色。它不仅具备分布式实时文件存储功能,对每个字段进行索引并支持搜索,还提供分布式实时分析搜索能力,能处理大规模的...
它是基于 Lucene 库的,提供了高级的搜索功能、性能优化和易于管理的特性。以下是对 Solr 入门知识的详细说明: **1. 安装环境** 在开始使用 Solr 之前,确保你的系统满足以下条件: - **Java 运行环境 (JRE) 或 ...
Elasticsearch基于Lucene库构建,以其分布式、可扩展性和高性能而闻名。 ### 一、Elasticsearch核心概念 1. **索引(Index)**:在Elasticsearch中,索引类似于数据库中的表,是文档的容器,用于存储相同类型的...
### ElasticSearch简易操作指南 **Elasticsearch**是一款基于Lucene的开源搜索和分析引擎,适用于全文检索、结构化检索及分析等场景。...后续章节将进一步探讨如何进行数据索引、查询以及管理和优化集群性能等内容。
"build_date" : "2021-06-10T21:01:55.251515791Z", "build_snapshot" : false, "lucene_version" : "8.8.2", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : ...
Elasticsearch是基于Lucene的开源搜索引擎服务,被广泛应用于提供关键字查询的全文搜索、大数据日志分析(如ELK栈)等场景。Elasticsearch具有易于部署和集群管理的特点,因此在国内外许多大公司,如百度、京东、...
1. **全文搜索**:为用户提供关键词查询功能,广泛应用于电商、新闻、内容推荐等领域。 2. **ELK栈**:Elasticsearch、Logstash和Kibana组成的日志处理分析解决方案,处理和分析海量日志数据。 3. **大数据领域**:...