`
hankesi2000
  • 浏览: 97300 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Solr、lucene查询语句作或查询时的注意点

阅读更多
在使用lucene做搜索引擎时,中文的查询是值得注意的一点。其中有一些问题需要尤其注意:

首先推荐在lucene方面的牛人的博客:http://forfuture1978.iteye.com/blog/588716,这里有关于查询的一些疑惑,在此不再做介绍。另:他的其他关于lucene的文章,也强烈推荐。

在查询方面,与的查询,基本不会有太大问题,中文分词工具分好词后,所有的term都会变为PhraseQuery的方式,依次对查询条件进行查询。

如果用户输入的查询条件,想到的是或的关系,或者因为需求方面的问题,希望返回更多的数据给用户,则都需要使用或的关系。

1. autoGeneratePhraseQueries=false
由于lucene默认是使用PhraseQuery来检索数据,那我们的需求就不满足了,这里需要做一个简单的修改,在schema.xml中:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">

其中autoGeneratePhraseQueries为true时,为精确查找,即AND的关系,改为false即可。此时,Query的实现类变为BooleanQuery,多个term变为SHOULD的关系,便实现了OR的需求。

下面来看一下源代码:
QueryParse.term(String)的部分代码为
       if (wildcard) {
         q = getWildcardQuery(field, termImage);
       } else if (prefix) {
         q = getPrefixQuery(field,
           discardEscapeChar(term.image.substring
          (0, term.image.length()-1)));
       } else if (fuzzy) {
          float fms = fuzzyMinSim;
          try {
            fms = Float.valueOf(fuzzySlop.image.substring(1)).floatValue();
          } catch (Exception ignored) { }
         if(fms < 0.0f || fms > 1.0f){
           {if (true) throw new ParseException("Minimum similarity for a FuzzyQuery has to be between 0.0f and 1.0f !");}
         }
         q = getFuzzyQuery(field, termImage,fms);
       } else {
         q = hasNewAPI ? getFieldQuery(field, termImage, false) : getFieldQuery(field, termImage);
       }
     


注意
q = hasNewAPI ? getFieldQuery(field, termImage, false) : getFieldQuery(field, termImage);

这一句中,hasNewAPI =true(3.1版本中为静态变量),则进入getFieldQuery(field, termImage, false)中:
if (numTokens == 0)
      return null;
    else if (numTokens == 1) {
      ....
    else {
       if (severalTokensAtSamePosition || (!quoted && !autoGeneratePhraseQueries)) {
            BooleanQuery q = newBooleanQuery(positionCount == 1);
       }else{
            PhraseQuery pq = newPhraseQuery();
       }
    }

这里可以看到,如果autoGeneratePhraseQueries为false,才能创建BooleanQuery对象,否则就为PhraseQuery

2. 禁用"?*~等一些特殊字符
在term()的代码中,如果使用字符"*?~则会进入下面的伪代码中:
 case PREFIXTERM:
       q = getPrefixQuery(field,
           discardEscapeChar(term.image.substring
          (0, term.image.length()-1)));
 case WILDTERM:
        term = jj_consume_token(WILDTERM);
                           wildcard=true;
 case QUOTED:
         q = getFieldQuery(field, discardEscapeChar
(term.image.substring(1, term.image.length()-1)), s);
 case FUZZY_SLOP:
         q = getFuzzyQuery(field, termImage,fms);

他们最终产生的对象,都不会是BooleanQuery。这样的情况下,导致这些分支都进入不到
 q = hasNewAPI ? getFieldQuery(field, termImage, false) : getFieldQuery(field, termImage);
中,这样一来,所有的处理都变成以AND为前提的处理

3. 思考
怎么处理这样的问题呢?目前正在探索中,暂时考虑到的方式就是在客户端先作一次预处理,将不符合OR场景的情况都处理成OR的情况,然后再交给lucene去处理。当然,这个方案有个很明显的问题,即分词模块都要集成到客户端,造成很大的冗余。

有什么好的方法吗?欢迎提出









分享到:
评论
1 楼 muqingren 2013-11-01  
写的很好

相关推荐

    基于Solr的多表join查询加速方法

    - **查询设计**:通过调整查询语句的结构,如使用“exists”查询或“join”查询,以适应Solr的查询机制,提升性能。 - **硬件和架构优化**:例如,增加Solr服务器的内存,使用SSD硬盘提升I/O速度,或者采用更高效的...

    solr查询语法.pdf

    Solr是一种基于Apache Lucene的开源搜索引擎,提供了丰富的查询语法来满足各种搜索需求。在了解Solr查询语法前,我们首先需要了解几个核心概念。 首先,Solr的查询解析是通过queryParser来配置的,通常使用默认配置...

    solr创建索引并查询

    ### Solr创建索引并查询的关键知识点 #### 一、Solr简介 Apache Solr是一款开源的全文搜索引擎平台,基于Lucene实现。它提供了一套完整的搜索解决方案,并且支持多种高级特性,如高亮显示、分面搜索、地理位置搜索...

    solr4.3源代码一

    Solr的QueryParser将用户输入的查询语句转化为Solr可以理解的结构,然后通过查询优化器生成高效的执行计划。在源代码中,你可以找到关于这些的实现,例如Query类和QueryParser子类。 **分布式搜索** SolrCloud是...

    solr基础知识介绍

    它的另一个显著特点是索引格式与应用平台无关,Lucene通过定义一套基于8位字节的索引文件格式,使得在不同平台或系统之间共享和使用索引成为可能。此外,Lucene还支持分块索引,这意味着它可以为新文件建立小的索引...

    solr1.4教程

    1.2.1 Solr使用Lucene并且进行了扩展:Solr基于Java Lucene库构建,增强了Lucene的功能,提供了更丰富的查询语法、分布式搜索、多文档类型支持等特性。 1.2.2 Schema(模式):Schema定义了索引中的字段及其属性,...

    solr介绍及使用.docx

    索引数据后,用户可以通过 Solr 的查询接口执行搜索,查询语句可以包含各种条件、过滤器和排序规则,实现复杂的查询逻辑。Solr 还支持实时更新和增量索引,保证了数据的实时性。 为了进一步优化搜索体验,Solr 支持...

    solr文档solr文档

    在"Solr注意.txt"文件中,可能会包含一些使用Solr过程中需要注意的事项或最佳实践,例如避免使用不推荐的配置选项,或是对特定功能的限制和警告。 "archives"可能是一个包含历史版本或备份的目录,对于跟踪Solr的...

    solr4.9开发所需jar包

    Solr4.9是Apache Solr的一个版本,它是一个基于Lucene的全文搜索服务器,用于构建高效的、可扩展的搜索应用。在这个版本中,Solr提供了丰富的查询功能、高效的索引和搜索性能,以及灵活的数据处理能力。"solr4.9开发...

    solr入门java工程

    在学习和使用这个"solr入门java工程"时,你需要理解以下关键点: 1. Solr的基本概念和功能,如索引、查询、分面搜索等。 2. FusionInsight Solrtest的用途和如何使用它进行性能测试。 3. Java客户端SolrJ的使用,...

    asp.net调用Solr

    总结来说,ASP.NET调用Solr涉及的主要知识点包括:使用SolrNet客户端库、配置Solr连接、索引和查询操作、利用Solr的高级功能以及性能优化。掌握这些要点,你就能在ASP.NET应用中构建出强大而高效的搜索功能。

    solr项目和相关资源.rar

    查询解析将用户输入的查询语句转化为Solr可以处理的形式。排序允许我们按照特定标准(如相关度)排列结果。高亮显示用于突出显示匹配查询的部分。分面搜索则有助于用户探索数据的不同维度。 2. **配置文件**:...

    Solr技术分析及运用

    - 在`solrconfig.xml`中配置数据源、查询语句和映射规则,以便Solr能读取和索引数据库中的数据。 通过上述步骤,可以建立一个基本的Solr环境,并配置用于特定数据集的核心。Solr的强大之处在于其灵活性和可扩展性...

    solr6--solr-dataimporthandler-scheduler-1.1

    Solr是Apache Lucene项目下的一个企业级搜索服务器,它提供了全文检索、命中高亮、 faceted search(分面搜索)等多种功能。在Solr6版本中,DataImportHandler(DIH)是一个非常重要的特性,它允许Solr从外部数据源...

    lucene3.6.2 jar包

    其中,索引模块提供了文档的存储和检索方式,查询模块则负责解析用户输入的查询语句并生成相应的查询对象。 2. **lucene-analyzers-3.6.2.jar**:这个库提供了各种文本分析器,用于处理和预处理输入的文本数据。...

    SOLR-7学习2020.docx

    它提供了更友好的界面,支持分布式搜索、负载均衡、数据导入导出以及更复杂的查询语句等特性。 Solr 的目录结构包括了多个核心(Core)的配置,每个核心对应一个独立的索引。创建新核心时,需要指定 InstanceDir 和 ...

    solr 企业搜索引擎教程

    ### Apache Solr 企业搜索引擎教程知识点总结 #### 1. Apache Solr 概述 - **Solr**:Apache Solr 是一款高度可扩展且高性能的企业级搜索平台,由Apache软件基金会维护。它是一个开源搜索服务器,使用Java语言编写...

    Solr-search过程源码分析

    在深入探讨Solr-search过程的源码分析时,我们聚焦于关键步骤与核心组件,以求全面理解Solr搜索机制的内部运作。Solr作为一款高性能、可伸缩的开源搜索平台,其搜索处理流程涉及多个层次的组件交互与数据处理,其中...

    solr搜索引擎支持分页

    Solr搜索引擎支持分页是其核心特性之一,它在处理大量数据检索时,为了提高用户体验,提供了高效且灵活的分页解决方案。Solr是基于Java的开源全文搜索服务器,采用了Apache Lucene作为其核心搜索引擎库。Lucene是...

Global site tag (gtag.js) - Google Analytics