获取中...

-

Just a minute...

solr原理

索引

Solr/Lucene采用的是一种反向索引(倒排索引),所谓反向索引:就是从关键字到文档的映射过程,保存这种映射这种信息的索引称为反向索引

  • 左边保存的是字符串序列
  • 右边是字符串的文档(Document)编号链表,称为倒排表(Posting List)

    索引创建


    一、把原始文档交给分词组件(Tokenizer)
  1. 将文档分成一个一个单独的单词
  2. 去除标点符号
  3. 去除停词(stop word)

二、词汇单元(Token)传给语言处理组件(Linguistic Processor)

  1. 变为小写(Lowercase)。
  2. 将单词缩减为词根形式,如”cars”到”car”等。这种操作称为:stemming。
  3. 将单词转变为词根形式,如”drove”到”drive”等。这种操作称为:lemmatization
    三、 得到的词(Term)传递给索引组件(Indexer)
  4. 利用得到的词(Term)创建一个字典
  5. 对字典按字母顺序排序
  6. 合并相同的词(Term)成为文档倒排(Posting List)链表

    搜索步骤

  7. 对查询内容进行词法分析、语法分析、语言处理
  8. 搜索索引,得到符合语法树的文档集合
  9. 根据查询语句与文档的相关性,对结果进行排序

    空间搜索原理

    空间搜索,又名Spatial Search(Spatial Query),基于空间搜索技术,可以做到:
  10. 对Point(经纬度)和其他的几何图形建索引
  11. 根据距离排序
  12. 根据矩形,圆形或者其他的几何形状过滤搜索结果
    在Solr中,空间搜索主要基于GeoHash来实现:

    GeoHash算法

    通过GeoHash算法,可以将经纬度的二维坐标变成一个可排序、可比较的的字符串编码。
    在编码中的每个字符代表一个区域,并且前面的字符是后面字符的父区域。其算法的过程如下:
    根据经纬度计算GeoHash二进制编码
    地球纬度区间是[-90,90], 如某纬度是39.92324,可以通过下面算法对39.92324进行逼近编码:
  13. 区间[-90,90]进行二分为[-90,0),[0,90],称为左右区间,可以确定39.92324属于右区间[0,90],给标记为1;
  14. 接着将区间[0,90]进行二分为 [0,45),[45,90],可以确定39.92324属于左区间 [0,45),给标记为0;
  15. 递归上述过程39.92324总是属于某个区间[a,b]。随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167;
  16. 如果给定的纬度(39.92324)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法的进行会产生一个序列1011 1000 1100 0111 1001,序列的长度跟给定的区间划分次数有关。

    同理,地球经度区间是[-180,180],对经度116.3906进行编码的过程也类似:
相关文章
评论
分享
  • MyBatis

    MyBatis介绍在介绍MyBatis之前先简单了解几个概念:ORM,JPA。 ORMORM(Object-Relationship-Mapping):是对象关系映射的意思,它是一种思想,是指将数据库中的每一行数据用对象的形式表现出来...

    MyBatis
  • Nginx

    Nginx是什么?Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务其他的HTTP服务: HTTPD-Apache基金会 IIS-微软 GWS-Google(不对外开放)我们为什么选择Nginx?1. IO多路复用epol...

    Nginx
  • Tomcat

    Tomcat是什么?Tomcat 服务器Apache软件基金会项目中的一个核心项目,是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选...

    Tomcat
  • Kafka

    Kafka介绍Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场...

    Kafka
  • netty

    1、IO和NIO 面向流和面向Buffer传统IO和Java NIO最大的区别是传统的IO是面向流,NIO是面向BufferJava IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能...

    netty
  • Zookeeper

    ZooKeeper 是什么?ZooKeeper 是一个开源的分布式协调服务。它是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、...

    Zookeeper
  • Spring

    Spring 介绍什么是spring?Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-sta...

    Spring
  • Dubbo

    1、Dubbo的架构原理Dubbo架构图 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monito...

    Dubbo
  • System-Security

    认证 认证(Authentication) 系统如何正确分辨出操作用户的真实身份? 通信信道上的认证:你和我建立通信连接之前,要先证明你是谁。在网络传输(Network)场景中的典型是基于 SSL/TLS 传输安全层的认证。 通信...

    System-Security
  • OAuth2授权码模式第三方应用先要到授权服务器上进行注册,然后从授权服务器中获取 ClientID 和 ClientSecret,以便能够顺利完成如下授权过程: 第三方应用将资源所有者(用户)导向授权服务器的授权页面,并向授权服务...

Please check the parameter of comment in config.yml of hexo-theme-Annie!