`
suichangkele
  • 浏览: 198064 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
BinaryDocValue的读取和NumericDocValue的读取的原理是差不多的,都是在打开一个新的段时,先读取meta文件,也就是 索引文件,读取到内存,然后保存起来,再用刀某个doc的docValue的时候再去读data文件。看下读取meta文件的代码吧,是在Lucene410DocValuesProducer.readBinaryEntry(IndexInput)中: static BinaryEntry readBinaryEntry(IndexInput meta) throws IOException { BinaryEntry entry = new Binary ...
BinaryDocValue是存储的byte[],也就是他可以存一些字符串、图片,等可以用byte[]表示的内容。他的使用场景我们不关心,主要看下他是如何在lucene中存储的吧。他的添加还是在DefaultIndexingChain.indexDocValue方法里面,这里还是先保存在内存中,我们介绍一下如何在内存中保存的。使用的类是:BinaryDocValuesWriter,构造方法如下: public BinaryDocValuesWriter(FieldInfo fieldInfo, Counter iwBytesUsed) { this.fieldInfo = fieldI ...
对lucene的docValue的读取是在Lucene410DocValuesProducer中,我们看下他的构造方法,其中类的代码我也复制了一些有用的 class Lucene410DocValuesProducer extends DocValuesProducer implements Closeable { /** 适用于numericDocValue的docValue,key是域号,value是对应的域的meta文件的属性,在打开时候就会读取meta文件*/ private final Map<Integer, NumericEntry> numerics; ...
各种类型的docValue的写入是在添加索引的时候,在org.apache.lucene.index.DefaultIndexingChain.indexDocValue(PerField, DocValuesType, IndexableField)方法里面,会有五种类型的docValue,会分别调用不同的DocValueWriter来实现,这篇介绍数字类型的docValue,他是一个很简单、很高效率的docValue的存储。 case NUMERIC://如果是数字类型的docValue if (fp.docValuesWriter == null) { fp.docValues ...
        docValue是一个很好用的东西,他是存储的正向的信息,即一个doc-->该doc的一个值,他是区别于stored的域的。在lucene中,docValue是按照列进行存储的,即所有的doc的某个相同名字的域存储在一起,而不是一个doc的所有的 ...
换公司了,公司的solr使用的是4.10,使用了ReRankQuery,我自己看了下源码。   先介绍一下solr的reRank,他的意思是进行两轮查找,第一轮对所有的doc进行查找,指定要查找多少个doc,第二轮是在第一轮中查找到的所有的doc中在进行一遍查找,使用一个不同的查询逻辑(也就是另一个query),重新打分,可以指定两次得分的最终处理的策略,最后返回需要查找的结果。说白了,他就是一个query,只不过他的查询是分两次的,这样做有一个好处,如果我们的查询的方式很麻烦,也就是需要的计算量很大,那么在文档很多的时候,进行大量的计算是很耗时的,但是如果我们对于大量的文档只进行一个很 ...
都知道solr有四个缓存,queryResultCache,documentCache,filterCache,fieldValueCache,今天我要好好说一下filterCache,据说他是用来缓存fq的docid的,也就是当搜索到一个fq对应的query的所有的docid之后,对这个结果进行缓存,方便以后的重复 ...
在上一篇博客中已经说了,valueSource就是获得一个doc的某些值,这个值可以是doc的某些域的值,也可以是现计算的一些函数值,这个博客里面就说一下solr中已经存在的valueSource。  valueSource的实现类有很多,在solr的源码中我看 ...
        之前我在跟别人分享solr(lucene)的时候,在谈论到一些特殊的query,比如prefixquery、wildcardQuery的时候,我曾经说过一句话:query就是得到词典表中的term,然后判断是不是符合条件,有的query(比如termquery)仅仅是判断词典 ...
换公司了,因为历史遗留原因,新公司不用solrcloud,他们使用的是主从复制模式,所以趁没有任务就看了下主从复制的原理,记个笔记。 先说下solrcloud下复制的原理吧,solrcloud中每个doc是要添加到对应的shard中,并且添加的一定是leader,然后由leader写到自己的索引后再转发到其他的replica中,也就是采用的push的方式,并且是每个doc都会进行这样的操作。leader和replica的区别仅仅是doc的来源的区别,leader由solrj添加,而非leader由leader转发。其他的操作,比如commit、softCommit都是独立的,也就是lead ...

solr VS es

    博客分类:
  • solr
今天看了一个对比es和solr的文章,是《lucene in action》的作者写的: https://www.datanami.com/2015/01/22/solr-elasticsearch-question/,他在这篇文章中对solr赞美的话毫不吝啬,认为solr绝对不比es差,反而认为es不如solr的地方很多,尤其是我觉的最后的一段话不错:如果你已经在solr上投入了大量精力,那么继续坚持吧,完全没有必要因为es提供的更多的分析功能而废弃solr转向es。   心里踏实了,老老实实看solr的源码吧。。。。
f双方都 在重入锁(ReentrantLock)中,有两个相似的方法,一个是lock,一个是lockInterruptably,之前没有细看,之前我一直用的是lock,不过最近再看公司的代码时,发现有人竟然用的是后者,于是我就好奇了,特么的到底哪里不一样,于是跟了下源码,特此记录一下。(ReentrantLock使用aqs实现的,最好先看懂aqs再来搞重入锁)。 再lock中,最终调用的是:java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(int)方法, public final void acquire(int ...
今天看了一下jdk的定时任务的源码,将此记录再次一下我的感受,方便出问题时的查找。 这次突发想看定时任务的原理的原因是在代码中使用到了,以为我们要定期的执行一个任务,但是我又不想使用线程+while true的操作,所以就想起了jdk的功能,但是有知道他的原理,害怕出岔子,所以就看了一下。看这个博客需要知道线程池的原理,也就是Executors.newFixedThreadPool 或者 是Executors.newCachedThreadPool的实现原理。(其实很简单,就是使用了一个阻塞队列,然后启动多个线程去队列中获取任务,如果队列中任务没有,就阻塞线程,线程的启动数量是受到两个参数的 ...
一直在使用solr的reload命令,不过一直使用的是集合的reload,即ip:port/solr/admin/collections?action=RELOAD&name=xx,其中xx是集合的名字;最近发现还有core的reload,即:ip:port/solr/admin/cores?action=RELOAD&core=coreName,本来觉得这个solr可是真好,还提供更加细致的操作,但是今天自己做实验,发现他貌似有bug,在修改了配置文件,然后添加了一些索引之后,使用core的reload会造成查询到的结果数不稳定,我使用的事*:*查询的,一会是20,一会是25, ...
今天在测试一个solr的排序问题的时候,突然建立不了索引了,我用的分布式的solrCloud(4.7.2版本),报一个异常—— org.apache.solr.client.solrj.impl.CloudSolrServer$RouteException: ERROR: [doc=0] cannot set an index-time boost, unindexed or norms are omitted for field cat: cat,大意是对于不建立索引或者标准因子忽略的域不能使用boost,然后我看了一下我的scheme.xml中cat域的配置 <field nam ...
Global site tag (gtag.js) - Google Analytics