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

多个term查询的步骤

阅读更多
多个term查询的步骤
分别查找每个term对应的结果
查询步骤
Term :a  -----》tii-------》tis-------》frg  保存结果 --- TermScorer1

Term :b  -----》tii-------》tis-------》frg  保存结果---  TermScorer2



得到结果集分别缓存在TermScorer二个数组里面

doc[]
frg[]
这个二个数组的大小为32,所以如果查询结果一次最多只取32个

封装查询结果
查询的结果封装为BooleanScorer2,构建BooleanScorer2的时候会创建ConjunctionScorer对象,ConjunctionScorer会在构造函数里面调用doNext()取得第一个查询结果的交集
结果的合并算法
private int doNext() throws IOException {
    int first = 0;
    int doc = scorers[scorers.length - 1].docID();
    Scorer firstScorer;
    while ((firstScorer = scorers[first]).docID() < doc) {
      doc = firstScorer.advance(doc);
      first = first == scorers.length - 1 ? 0 : first + 1;
    }
    return doc;
  }

算法是取最后个结果集的最小的一个docid,在结果集合scorers数组里面每个scorer有个doc属性,保存了一个term结果集里面最小的docId。
Scorers 的保存的对象是有序的,排序的规则是按scorer的doc比较的
算法如下
Arrays.sort(scorers, new Comparator<Scorer>() {         // sort the array
      public int compare(Scorer o1, Scorer o2) {
        return o1.docID() - o2.docID();
      }
});
合并算法的思想是取出最后一个scorer的doc属性的值A,和剩下的scorer的属性doc属性比较,如果小于A,则调用方法doc = firstScorer.advance(doc)取出大于或者等于A的docId。如果没有找到返回NO_MORE_DOCS,这个值其实是Integer.MAX_VALUE。返回这个值表示没有符合条件的docId,则返回,说明没有交集。

举例如下
Scorers[]数组如下


Termscore1   doc =1
              docs []={1,3,5,6,7,8}

Termscore2   doc =2
              docs []={2,4,5,6,7,8}



Termscore3   doc =3
              docs []={3,5,7,8}


Termscore4   doc =5
              docs []={5,6,7,8}


取出Termscore4.doc复制给变量doc

和Scorers[]数组中的scorer对象比较
第一次是和Termscore1.doc比较,小于5
循环Termscore1.docs[] 找出大于等于5的docId是Termscore1.docs[2]
赋值给doc= Termscore1.docs[2];
计算下一个比较对象
first = first == scorers.length - 1 ? 0 : first + 1;

得到first的值是1。取出Scorers[1].doc 和5比较,小于5,循环Scorers[1].docs[] 找出大于等于5的docId是Scorers[1].docs[2],
赋值给doc= Termscore1.docs[2];
计算下一个比较对象
first = first == scorers.length - 1 ? 0 : first + 1;
以此类推,知道比较最后一个对象Scorers[4].doc,发现不小于,说明在所有是数据集之中5是共同的元素。返回5,放到collector里面去。

Collector的收集方法
结果会放在org.apache.lucene.util.PriorityQueue优先队列的一种实现类里面
方法如下,
public final T add(T element) {
    size++;
    heap[size] = element;
    upHeap();
    return heap[1];
  }
Faq
是否会查询所有的结果进行合并?
是的,lucene, scorers[length-1] 中docs [] 32 个docId用完了,会再去读文件,其余的scorer 会去读文件用DefaultSkipListReader读取
分享到:
评论

相关推荐

    TeraTerm终端使用方法

    TeraTerm终端使用方法 TeraTerm是一款功能强大且广泛应用的终端仿真软件,它可以模拟各种...用户只需按照上述步骤操作,选择合适的安装选项和设置串口号,就可以轻松地使用TeraTerm工具实现自动保存电视机输出信息。

    Teraterm工具,配置优化版本

    - **窗口管理**:多窗口支持,便于同时管理多个会话。 - **Unicode支持**:支持多种字符编码,适应不同语言环境。 - **透明度设置**:调整窗口透明度,使背景内容可见。 - **SSH密钥管理**:支持SSH密钥对登录,...

    S-Term 远程控制程序

    - **多会话管理**:可以同时管理多个远程连接,便于对比和调试。 - **自定义配置**:支持个性化设置,如字体、颜色、快捷键等,以满足不同用户需求。 - **安全性**:采用加密通信,保障数据安全,防止未经授权的...

    teraterm.rar

    6. **透明度与窗口置顶**:Teraterm可设置窗口透明度,便于同时查看多个会话;还可以设置窗口始终在最上方,方便多任务处理。 7. **插件扩展**:Teraterm拥有丰富的第三方插件,如VT100/102模拟器、TTY转USB适配器...

    Tera Term2.3

    TTERMPRO是Tera Term的一个扩展版本,通常包含更多的功能和定制选项,但这里并未提供具体文件,可能是指该压缩包包含Tera Term的某个专业版或增强版。 总结来说,Tera Term 2.3是一款强大且灵活的终端模拟工具,...

    Sarasa更纱黑体term-sc.zip

    Windows Terminal是一款现代、可自定义的终端应用,它允许用户同时管理多个命令行环境,如cmd.exe、Powershell、Git Bash等。集成Sarasa Gothic字体后,可以提升终端的界面风格,让代码更具美感,尤其是在处理大量...

    Term-weighting_approaches_in_automatic_te

    综上所述,“Term-weighting Approaches in Automatic Text Retrieval”不仅是信息检索领域的经典文献,也是自然语言处理、文献搜索与分类等多个领域不可或缺的基础知识。掌握术语加权方法不仅有助于提升文本检索的...

    Lucene索引和查询

    本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行索引创建和查询操作。 首先,我们需要了解Lucene的基本概念。Lucene的核心思想是将文本数据转换为结构化的索引,以便于快速查找相关文档。这个过程...

    非常好用的teraterm串口工具,找了很多并适用,这个版本是最好用的,绿色免安装,需要配置一下log路径即可

    在日志记录方面,正如描述中提到的,配置日志路径是使用Teraterm的一个关键步骤。Teraterm允许你实时记录接收和发送的数据,这对于记录通信过程中的数据流、分析问题或保存重要信息非常有用。只需在软件设置中指定一...

    3GPP Long Term Evolution

    3GPP为LTE定义了一系列规范文档,涵盖了物理层、数据链路层以及网络层等多个层面的技术细节。这些文档包括但不限于TS 36.211(物理信道和调制)、TS 36.212(复用和信道编码)、TS 36.213(物理层过程)等。 ##### ...

    Single Carrier FDMA--A New Air Interface for Long Term Evolution

    《Single Carrier FDMA: A New Air Interface for Long Term Evolution》是一本专注于Single Carrier Frequency Division Multiple Access(单载波频分多址接入,简称SC-FDMA)技术的专著。本书由Hyung G. Myung...

    Long Short Term Memory Networks for Anomaly Detection in Time Series

    首先,一个LSTM网络在非异常数据上进行训练,然后用作未来多个时间步的预测器。预测误差被视为一个多变量高斯分布,用于评估异常行为的可能性。具体而言: - **网络训练**:选择一段代表正常行为的时间序列数据对...

    lucene搜索的步骤

    1. **用户输入**:用户提交查询语句,可以包含一个或多个关键词。 2. **查询解析**:查询语句经过分析器(Analyzer)处理,同样进行分词和词元过滤,生成查询词汇项。 3. **查询树构造**:查询词汇项被组织成查询...

    论文研究-DOTE: Automatic Domain-specific Term Extraction from Wikipedia.pdf

    这些术语对于构建本体、自动化摘要生成、自然语言处理等多个任务具有重要的价值。领域特定术语(domain-specific terms)指的是描述某一领域内特定概念的术语,例如在数据挖掘中,“聚类分析”(Cluster analysis)...

    Deep Multi-Task Learning for Aspect Term Extraction.pdf

    LSTM的关键特点是它引入了所谓的“门”结构,这些门用来控制信息的流入、流出和遗忘,使得LSTM能够捕捉到序列数据中的复杂模式,并在多个时间步骤中保持信息。在本研究中,LSTM通过扩展记忆和神经记忆操作用于方面...

    开源项目-erroneousboat-slack-term.zip

    3. **多团队支持**:如果你在多个Slack团队之间切换,Slack Term可以方便地在它们之间进行快速切换。 4. **通知系统**:当有新的消息时,它会在终端提示你,确保你不会错过任何重要信息。 5. **自定义配置**:用户...

    Long Short-Term Memory Networks With Python.pdf

    - **书本结构**:内容分为多个章节(Lesson),每个章节都包含一个具体的话题,逐步引导读者从基础理论到实际模型的构建。每个章节结尾通常有总结和进一步阅读的建议。 - **阅读指南**:建议读者按照章节顺序阅读,...

    统计多个文本的频数和tf值

    这里,我们将深入探讨如何使用Java语言来处理多个文本文件,并计算它们的频数和TF值。 首先,我们需要理解什么是频数(TF)。频数是指一个词在文档中出现的次数,它反映了该词在文档中的频繁程度。计算公式通常为:...

    LTE信道号查询,非常方便

    例如,频段38代表2570-2620MHz的频率范围,这个频段可以被分割成多个信道供不同用户或服务使用。 查询LTE信道通常涉及以下步骤: 1. **识别频段**:了解所在地区的可用LTE频段,这可以通过查阅运营商资料或者使用...

    lte nas的解密步骤

    通过对以上步骤的详细解析,我们可以了解到在LTE网络中解密NAS消息的过程不仅涉及到多个协议接口(如S6a和S1AP),还需要准确提取和关联多个关键参数。理解这些步骤有助于更好地管理和维护LTE网络的安全性,同时也有...

Global site tag (gtag.js) - Google Analytics