`
粟谷_sugu
  • 浏览: 26164 次
社区版块
存档分类
最新评论

解决solr缓存造成的query查询问题

    博客分类:
  • solr
阅读更多
背景
目前在公司,实现solr的一个菜名推荐模块的时候,遇到了一个困扰了好几天的问题,就是当实现了模块的逻辑代码并确认功能实现后,在部署测试后发现了一个bug,就是多次查询结果均重复第一次查询的结果。
问题排查
首先想到是不是之后的几次查询并没有真正调用到实现的逻辑,所以在本地IDEA中远程调试服务器上代码,发现当在solr中查询时,确实进入到逻辑代码中打得断点,而且确实传递了不同的query参数到方法中,只是返回的结果依旧不符合预期,只是重复第一次的结果。
再次考虑到是不是solr的某些缓存机制,将多条查询结果识别为了同一条,并直接返回了缓存中的结果。想到这个结果后,我开始了漫长的单步调试过程,希望定位到可能有问题的代码中,并同时在查找关于solr缓存的相关内容。
最后在solr的conf文件中,定位到了相关缓存代码
<query>
    <maxBooleanClauses>1024</maxBooleanClauses>

    <filterCache class="solr.FastLRUCache"
                 size="512"
                 initialSize="512"
                 autowarmCount="0"/>

    <!-- 加上这段,会有多次查询结果相同的问题-->
    <queryResultCache class="solr.LRUCache"
                     size="512"
                     initialSize="512"
                     autowarmCount="0"/>
     
    <documentCache class="solr.LRUCache"
                   size="512"
                   initialSize="512"
                   autowarmCount="0"/>
    
    <cache name="perSegFilter"
      class="solr.search.LRUCache"
      size="10"
      initialSize="0"
      autowarmCount="10"
      regenerator="solr.NoOpRegenerator" />

测试时发现当删掉中间标注的一段时,查询正常,所以确认是由于queryResultCache缓存将不同的query判断为同一个key,所以之后的查询均直接调用第一次缓存的结果。
发现这个结果后,查看queryResultCache的key是由什么确定的。
package org.apache.solr.search;
public QueryResultKey(Query query, List<Query> filters, Sort sort, int nc_flags) {
        this.query = query;
        this.sort = sort;
        this.filters = filters;
        this.nc_flags = nc_flags;
        int h = query.hashCode();
        Query filt;
        if(filters != null) {
            for(Iterator var6 = filters.iterator(); var6.hasNext(); h += filt.hashCode()) {
                filt = (Query)var6.next();
            }
        }

        this.sfields = this.sort != null?this.sort.getSort():defaultSort;
        SortField[] var10 = this.sfields;
        int var11 = var10.length;

        for(int var8 = 0; var8 < var11; ++var8) {
            SortField sf = var10[var8];
            h = h * 29 + sf.hashCode();
        }

        this.hc = h;  
    }

以上就是queryResultCache的key的定义类,其中key的hashcode就是hc属性。由定义可知,
int h = query.hashCode();
this.hc = h;
,经过单步调试,发现不同的query查询后,在此处得到的hc都是一样的,所以精确定位了问题出在自定义的query的hashcode生成中。
FreqQuery entends bitQuery extends Query
在超类Query中,定义方法
@Override
  public int hashCode() {
    return getClass().hashCode();
  }

继承的子类均没有覆写hashcode()方法,所以每个query的hashcode均相同。
定位问题后,修改方法也就很简单了,在FreqQuery中覆写此方法,注意做到各query的区分,同时也要保证相同query能命中缓存,此处我采用query的hashcode作为query的hashcode。修改完成后,提交代码,部署应用,发现结果和预期相同了。


远程调试的教程
https://www.cnblogs.com/wy2325/p/5600232.html
浅谈solr缓存
http://www.cnblogs.com/phinecos/archive/2012/05/24/2517018.html
0
0
分享到:
评论

相关推荐

    solr更换memcached缓存的方法

    3. **调整Solr缓存策略** Solr提供了多种缓存策略,你可以根据实际需求调整。例如,可以通过`autowarmCount`参数设置预热数量,通过`size`和`initialSize`控制缓存大小。对于`regenerator`,如果你选择使用...

    使用java实现solr-7.1.0的api和solr最新支持的sql查询

    在实际应用中,你还需要考虑性能优化,如使用Solr的缓存机制、分页查询、查询过滤器(Filter Queries)等。同时,为了确保高可用性和可扩展性,可能需要在生产环境中部署分布式Solr集群,利用ZooKeeper进行集群管理...

    solr中cache综述

    1. **查询结果缓存应用**:通过启用`queryResultCache`,Solr可以在内存中保存查询结果。这对于那些经常重复执行的查询特别有用,可以显著减少查询延迟。 2. **基于Filter Cache的查询优化**:`filterCache`用于...

    支持solr5.5 solr6.0中IK分词需要的资料

    - **性能调优**:根据实际数据量和查询需求调整 IK 分词器的配置参数,如缓存大小、最大扩展词长度等。 - **分词结果的精度**:观察并评估分词结果,对特定领域可能需要自定义词典以提高分词的准确性。 - **多语言...

    SOLR的应用教程

    Solr内置了多种缓存机制,如查询结果缓存、文档缓存、过滤器缓存等,以提高查询速度和系统性能。 1.2.6 复制 Solr支持数据复制,确保在主节点故障时,数据不会丢失,保持服务的高可用性。 1.2.7 管理接口 Solr...

    solr cache部分 中文解释

    1. 查询结果缓存(QueryResultCache):存储查询结果文档的列表,使得相同的查询可以在不重新计算的情况下快速返回结果。这对于频繁重复的查询尤其有用,可以显著减少对索引的磁盘访问。 2. 索引碎片字段值缓存...

    solr1.4教程

    1.2.5 缓存:Solr内置了多种缓存机制,如查询结果缓存、文档ID到DocValue的缓存等,显著提高了搜索性能。 1.2.6 复制:Solr支持主从复制,确保数据的安全性和高可用性,可以轻松地扩展集群规模。 1.2.7 管理接口:...

    Solr(Cloudera)使用手册

    #### 七、使用Solr缓存 Solr支持多种缓存机制,包括QueryResultCache、FieldValueCache等,这些缓存可以帮助提高搜索性能。 1. **Cache生命周期**:了解各种缓存的生命周期管理机制,比如何时清理缓存、如何设置...

    solr6.6.0源码

    1. **缓存机制**:Solr包含多种缓存,如查询结果缓存、filter缓存和document缓存,提高查询效率。 2. **实时索引**:Solr支持TLOG(Transaction Logs)和实时添加/更新,无需重启即可生效。 3. **并发控制**:Solr...

    asp.net调用Solr

    ASP.NET调用Solr是一个常见的任务,特别是在构建高效的企业级搜索解决方案时。Solr是Apache Lucene项目的一个分支,是一个开源、高性能的全文搜索引擎。它提供了丰富的查询语法、高效的索引和检索能力,以及灵活的...

    solr-6.6.0压缩包

    - Solr支持丰富的查询语法,如Lucene Query Parser语法、DisMax查询解析器等。 - 可以自定义排序规则,根据相关性、时间或其他字段值进行结果排序。 6. **高级特性** - ** faceting(聚类)**:允许用户按类别...

    apache solr 源文件 3.6.1

    9. **缓存机制**:Solr有多种缓存,如查询结果缓存、文档字段缓存等,以提高性能。这些缓存在`Cache`接口和相关实现类中定义。 10. **插件系统**:Solr允许用户自定义查询解析器、过滤器、请求处理器等,源代码中有...

    solr-7.7.3配置详解,跟springboot整合 (二)

    - `solrconfig.xml`:这是Solr的主要配置文件,用于设置索引、查询、缓存等行为。 - `schema.xml`:定义字段类型和字段,用于解析和存储文档内容。 3. **SolrCloud模式** - 在分布式环境中,Solr运行在SolrCloud...

    solr4.3源代码一

    Solr4.3是Apache Solr的一个早期版本,它是一个基于Lucene的全文搜索服务器,提供了高可配置、可扩展的搜索和分析功能。...同时,对于解决实际问题、优化搜索性能以及扩展功能等方面都有着重要的意义。

    solr-4.10.3

    Solr还支持多种查询语法,如标准查询解析器(Standard Query Parser)、Lucene查询语法(Lucene Query Syntax)等,以及高级特性如布尔运算、短语匹配和模糊搜索。 3. **配置与部署**:Solr的配置主要通过XML文件...

    solr教材-PDF版

    - **1.2.5 缓存**:Solr利用多种缓存机制来提高搜索响应速度,例如查询结果缓存、文档缓存等。 - **1.2.6 复制**:Solr支持主/从架构,通过复制功能可以在多个服务器间同步索引数据,确保数据的一致性和冗余。 - **...

    solr4.6.0 源代码

    通过研究Solr 4.6.0的源代码,开发者可以深入理解其内部工作原理,定制化搜索服务,优化性能,以及解决在部署和使用过程中遇到的问题。这不仅有助于提升对全文检索技术的理解,也有利于开发更加高效和个性化的搜索...

    高效的企业级搜索引擎Solr

    通过这些监控指标,管理员可以及时发现并解决性能瓶颈问题,确保Solr系统的稳定运行。 总之,Solr作为一款成熟的企业级搜索引擎,不仅提供了丰富的功能,还支持多种性能优化手段,使得它能够在复杂的应用场景下发挥...

    solr-4.9.1

    9. **搜索性能优化**:Solr提供多种手段来优化搜索性能,如使用倒排索引、缓存策略、查询过滤器缓存(QueryResultCache)、文档缓存(DocumentCache)等。 总的来说,Solr-4.9.1是一个全面的搜索引擎解决方案,它...

    最新版windows solr-8.9.0.zip

    - **查询解析器**:Solr提供灵活的查询语法,包括标准查询解析器(Standard Query Parser)和Lucene查询解析器,允许用户以不同的方式构造查询。 - **字段类型(Field Types)**:定义了索引和查询时字段的行为,...

Global site tag (gtag.js) - Google Analytics