`

lucence 支持类似关系数据库的嵌套查询吗?

 
阅读更多

文章出处: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是必须存在的。

分享到:
评论

相关推荐

    Elasticsearch笔记.rar

    3. **索引(Index)**:类似于关系数据库中的表,用于存储具有相同结构的数据。每个索引有自己唯一的名称,如"user_index"。 4. **类型(Type)**:在早期版本中,索引内可以定义多个类型,但现在已经被文档类型...

    ElasticSearchServer扩展的弹性搜索解决方案.docx

    - **索引**:类似于传统关系型数据库中的“表”,是文档的集合。每个索引都可以拥有多个分片和副本。 - **副本**:索引的副本用于提高查询性能以及在数据丢失的情况下提供冗余。副本数量可以通过配置来调整。 - **分...

    Mastering ElasticSearch.pdf

    2. **索引(Index)**:类似于数据库中的表,索引用于存储具有相似特性的文档集合。 3. **类型(Type)**:在一个索引中,可以定义一种或多种类型来进一步分类文档,尽管在新版本中已被移除。 4. **集群(Cluster)**:由...

    ES入门文档

    - 索引是ES中保存数据的基本单位,类似于关系型数据库中的表。 - **1.2.6 搜索功能** - 支持简单的匹配查询、全文搜索等高级功能。 - **1.2.7 汇总分析** - 提供聚合查询功能,用于统计数据或生成报表。 - **...

    Elasticsearch 演讲PPT

    - **文档(Document)**:存储在索引中的基本信息单元,类似数据库的记录。 - **分片(Shard)**:索引的逻辑部分,可以分布到不同的节点上,提高处理能力和容错性。 - **副本(Replica)**:分片的备份,确保...

    ElasticSearch学习(1).pdf

    - **逻辑设计**:类似关系型数据库,Elasticsearch 包含**集群(cluster)**、**索引(indices)**、**类型(types)**、**文档(documents)**和**字段(fields)**。 - **集群**:由多个节点组成,共享相同的配置...

    elastic search in action

    - **其他复合查询**:如常量得分查询、嵌套查询等。 #### 五、数据分析 ##### 5.1 文本分析过程 文本分析是Elasticsearch的核心功能之一,主要包括: - **字符过滤(Character Filtering)**:去除文本中的噪声字符。...

    hibernateSearch 搜索 索引列子源代码

    这使得开发者能够以 SQL 类似的查询方式执行复杂的全文搜索。 ### 2. 安装与配置 首先,你需要在项目中添加 Hibernate Search 和 Lucene 的依赖。对于 Maven 项目,可以在 `pom.xml` 文件中添加如下依赖: ```xml...

    Elasticsearch权威指南(中文版)

    3. **索引(Index)**:类似于数据库中的表,是数据的逻辑空间,可以包含一个或多个类型(旧版本)或不分类型(新版本)的文档。 4. **类型(Type/Document Type)**:旧版本Elasticsearch中对索引内的文档分类,新版本6...

    ElasticSearch分析与实践

    在Elasticsearch中,Aggregations(聚合)是其数据分析能力的关键部分,它类似于facets(筛选器),但提供了更强大的分析功能,可以嵌套以增加额外的维度,允许对数据进行复杂可视化,并且提供不同类型的聚合,包括...

    ES核心知识篇part1

    - **索引(Index)**:类似于关系数据库中的表,是数据的逻辑集合。 - **分片(Shard)**:为了实现水平扩展,ES将一个索引分成多个分片,每个分片可以分布在不同的节点上,数据可以在分片间分布和复制。 - **...

    电信设备-一种基于XML的信息搜索方法.zip

    - **倒排索引**:类似数据库中的索引,通过创建倒排索引来加速查找过程。 - **缓存策略**:对于频繁查询的部分,可以将结果缓存,减少不必要的计算和IO操作。 总结来说,“电信设备-一种基于XML的信息搜索方法”...

    Java进阶路线

    MySQL 是最常用的开源关系型数据库之一,了解它的使用方法和优化技巧对于开发者来说非常重要: - **SQL语言**:SQL 查询语句的编写。 - **SQL调优**:查询优化和索引管理。 - **鉴权**:用户身份验证。 - **数据...

    esrent:elasticsearch实践

    3. **索引与文档**:在ES中,数据以JSON文档的形式存储,每个文档属于一个索引,索引可以看作数据库,文档则类似于数据库中的记录。 4. **RESTful API**:ES采用HTTP协议和JSON格式,通过RESTful API进行操作,易于...

    Mapping 索引映射

    它类似于数据库中的数据模式,但更为灵活,适用于处理各种不同类型的结构化和非结构化数据。下面将详细介绍Mapping中涉及的核心数据类型、复杂数据类型、多字段、多值字段和倒排索引以及元字段。 **核心数据类型** ...

Global site tag (gtag.js) - Google Analytics