文章出处:http://blog.csdn.net/rick_123/article/details/6637121?reload
在这个网页看到这么,如果真的能实现,感觉lucence挺强大的,但是我有点怀疑是不是真的能实现,本人并没有真正试过。
关于BooeanQuery在搜索中的用处
我们在搜索中可能会遇到要搜索索引文件中不同字段,不同字段之间就存在了与或非的运算关系,如:这个xx字段中必须存在什么什么关键词,而另一个XXX字段可以存在或不存在什么什么关键词等等等。这就需要有BooleanQuery这个得到一个组合检索对象,进行组合检索了。
BooleanClause是在一个BooleanQuery中子句。该类中定义了一个静态最终内部类Occur定义了BooleanQuery的运算符:
public static final Occur MUST = new Occur("MUST"); // 与运算
public static final Occur SHOULD = new Occur("SHOULD"); // 或运算
public static final Occur MUST_NOT = new Occur("MUST_NOT"); // 非运算
例如:
public SearchObjects[] search(String path,String keyword, String type, int startIndex) {
// Date beginTime = new Date();
try {
Searcher searcher = new IndexSearcher(path);
// Analyzer aStandardAnalyzer = new StandardAnalyzer();
Analyzer aStandardAnalyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser("title",aStandardAnalyzer);
parser.setDefaultOperator(QueryParser.OR_OPERATOR);// 设置检索的条件.OR_OPERATOR表示"或"
Query query = parser.parse(keyword);
QueryParser qp1 = new QueryParser("content", aStandardAnalyzer);// 检索content列
qp1.setDefaultOperator(QueryParser.OR_OPERATOR);// 设置检索的条件.OR_OPERATOR表示"或"
Query query1 = qp1.parse(keyword);
BooleanQuery m_BooleanQuery = new BooleanQuery();// 得到一个组合检索对象
if (type!=null && !type.equals("")){
QueryParser qp2 = new QueryParser("type", aStandardAnalyzer);// 检索type列
qp1.setDefaultOperator(QueryParser.OR_OPERATOR);// 设置检索的条件.OR_OPERATOR表示"或"
Query query2 = qp2.parse(type);
BooleanQuery bq = new BooleanQuery();
bq.add(query1,BooleanClause.Occur.SHOULD);
bq.add(query,BooleanClause.Occur.SHOULD);
m_BooleanQuery.add(bq, BooleanClause.Occur.MUST);
m_BooleanQuery.add(query2, BooleanClause.Occur.MUST);
}else{
m_BooleanQuery.add(query1,BooleanClause.Occur.SHOULD);
m_BooleanQuery.add(query,BooleanClause.Occur.SHOULD);
}
Hits hits = searcher.search(m_BooleanQuery);
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(100));
SearchObjects[] so = processHits(hits, startIndex, keyword,highlighter);
//processHits为自定义的method解析搜索结果
searcher.close();
return so;
} catch (CorruptIndexException e) {
} catch (IOException e) {
} catch (Exception e) {
}
return null;
}
例子中是先搜索title或content字段中的结果再与上type字段中的结果,即 ((title||content)&&type);
MUST 也可以理解为是必须的,而SHOULD可以理解为可有可无的,例子中先title和content是可有可无的,但两个中必须有一个存在,type是必须存在的。
相关推荐
3. **索引(Index)**:类似于关系数据库中的表,用于存储具有相同结构的数据。每个索引有自己唯一的名称,如"user_index"。 4. **类型(Type)**:在早期版本中,索引内可以定义多个类型,但现在已经被文档类型...
- **索引**:类似于传统关系型数据库中的“表”,是文档的集合。每个索引都可以拥有多个分片和副本。 - **副本**:索引的副本用于提高查询性能以及在数据丢失的情况下提供冗余。副本数量可以通过配置来调整。 - **分...
2. **索引(Index)**:类似于数据库中的表,索引用于存储具有相似特性的文档集合。 3. **类型(Type)**:在一个索引中,可以定义一种或多种类型来进一步分类文档,尽管在新版本中已被移除。 4. **集群(Cluster)**:由...
- 索引是ES中保存数据的基本单位,类似于关系型数据库中的表。 - **1.2.6 搜索功能** - 支持简单的匹配查询、全文搜索等高级功能。 - **1.2.7 汇总分析** - 提供聚合查询功能,用于统计数据或生成报表。 - **...
- **文档(Document)**:存储在索引中的基本信息单元,类似数据库的记录。 - **分片(Shard)**:索引的逻辑部分,可以分布到不同的节点上,提高处理能力和容错性。 - **副本(Replica)**:分片的备份,确保...
- **逻辑设计**:类似关系型数据库,Elasticsearch 包含**集群(cluster)**、**索引(indices)**、**类型(types)**、**文档(documents)**和**字段(fields)**。 - **集群**:由多个节点组成,共享相同的配置...
- **其他复合查询**:如常量得分查询、嵌套查询等。 #### 五、数据分析 ##### 5.1 文本分析过程 文本分析是Elasticsearch的核心功能之一,主要包括: - **字符过滤(Character Filtering)**:去除文本中的噪声字符。...
这使得开发者能够以 SQL 类似的查询方式执行复杂的全文搜索。 ### 2. 安装与配置 首先,你需要在项目中添加 Hibernate Search 和 Lucene 的依赖。对于 Maven 项目,可以在 `pom.xml` 文件中添加如下依赖: ```xml...
3. **索引(Index)**:类似于数据库中的表,是数据的逻辑空间,可以包含一个或多个类型(旧版本)或不分类型(新版本)的文档。 4. **类型(Type/Document Type)**:旧版本Elasticsearch中对索引内的文档分类,新版本6...
在Elasticsearch中,Aggregations(聚合)是其数据分析能力的关键部分,它类似于facets(筛选器),但提供了更强大的分析功能,可以嵌套以增加额外的维度,允许对数据进行复杂可视化,并且提供不同类型的聚合,包括...
- **索引(Index)**:类似于关系数据库中的表,是数据的逻辑集合。 - **分片(Shard)**:为了实现水平扩展,ES将一个索引分成多个分片,每个分片可以分布在不同的节点上,数据可以在分片间分布和复制。 - **...
- **倒排索引**:类似数据库中的索引,通过创建倒排索引来加速查找过程。 - **缓存策略**:对于频繁查询的部分,可以将结果缓存,减少不必要的计算和IO操作。 总结来说,“电信设备-一种基于XML的信息搜索方法”...
MySQL 是最常用的开源关系型数据库之一,了解它的使用方法和优化技巧对于开发者来说非常重要: - **SQL语言**:SQL 查询语句的编写。 - **SQL调优**:查询优化和索引管理。 - **鉴权**:用户身份验证。 - **数据...
3. **索引与文档**:在ES中,数据以JSON文档的形式存储,每个文档属于一个索引,索引可以看作数据库,文档则类似于数据库中的记录。 4. **RESTful API**:ES采用HTTP协议和JSON格式,通过RESTful API进行操作,易于...
它类似于数据库中的数据模式,但更为灵活,适用于处理各种不同类型的结构化和非结构化数据。下面将详细介绍Mapping中涉及的核心数据类型、复杂数据类型、多字段、多值字段和倒排索引以及元字段。 **核心数据类型** ...