Apache Solr的基础

这篇文章是2020年团体附送日历的第19天的文章。

首先

我认为作为全文搜索引擎最受欢迎的是ElasticSearch,但是我曾经有过使用Apache Solr这类产品的工作经验。最近,为了复习,我重新阅读了关于Solr的书籍,所以我会简要总结一下。

就先不谈他们的详细差异、优点和缺点,只是先试着让它们动起来,这样的感觉。

Apache Solr和ElasticSearch的共同之处、优点和缺点是什么?

共同之处

    • 土台となる全文検索ライブラリとして、Apache Lucene を使用している

 

    Javaで実装されている

Apache Solr的优点和缺点。

    • 長所

検索パラメータはクエリパラメータとして指定するので、クエリDSLを使うElasticSearchと比較して直感的に記述できる
1つ目と被るが、ハイライト検索やファセット検索など、高度な検索機能でも比較的簡易なクエリパラメータで記述できる
実績が十分(ElasticSearchよりも先にリリースされている)
機能が豊富(ElasticSearchも充実してきているので、比較した上で長所、とは言えないかも)

短所

クラスタの構築は Apache Zookeeper が必要なため、設定が若干面倒
クエリパラメータで複雑な指定をすると見通しが悪くなる

ElasticSearch的优点和缺点。

    • 長所

構造的なクエリを作成できる「クエリDSL」は学習コストが高いものの、慣れれば複雑な検索を効率的に実施できる
クラスタの構築が簡単
便利な関連プロダクトが豊富(KibanaやLogstashなど)

短所

長所の裏返しで、クエリDSLの書き方が複雑で学習コストが高い(未だに書き方でいつも迷う・・・)

先试着运行看看

按照时间顺序,使用Docker进行启动。

version: "3"

services:
  solr1:
    image: solr:8.7
    container_name: solr1
    ports:
      - 8983:8983
    volumes:
      - ./solr:/var/solr
    command:
      - solr-precreate
      - solrbook
    networks:
      - solr

networks:
  solr:
solr管理画面.png
Solr中存在着一个名为”核心”的概念,它将架构、索引数据以及操作索引数据的Java对象集合在一起。通过创建核心,可以实现数据的注册和搜索。
Solr検索.png
curl http://localhost:8983/solr/solrbook/update?commit=true --data-binary @sample-data/sample-books.json -H 'Content-type:application/json'
Solr検索-2.png

高级搜索

我也尝试进行一些稍微高级的搜索。

突出搜尋

ハイライト検索.png

如果指定了查询参数,将以类似的方式显示与管理界面相同的结果。

curl 'http://localhost:8983/solr/solrbook/select?hl.fl=title&hl=on&q=title:%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0'

多面搜索

您可以按字段对搜索结果进行分组。

curl 'http://localhost:8983/solr/solrbook/select?facet.field=price&facet=on&q=*:*'

通过指定”facet.field=price”,对搜索结果进行按价格分组。

"facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "price":[
        "1980",114,
        "1480",59,
        "1780",56,
        "1880",54,
        "1680",50,
        "2480",49,
        "1380",48,
        "980",42,
        "1580",42,
        "2580",41,
        "2980",41,
        "2380",38,
        "2180",36,
        "2680",34,
        "1280",31,
        "2280",29,
        "857",27,
        "2880",25,
        "1000",24,
        "2780",24,
        "3200",24,
        "880",22,
        "1080",16,
        "1180",13,
        "840",12,
        "3500",12,
        "3600",9,
        "780",8,
        "950",8,
        "1143",8,
        "1200",8,
        "3300",8,
        "680",7,
        "1429",6,
        "3280",6,
        "690",5,
        "762",5,
        "900",5,
        "2080",5,
        "790",4,
        "1850",4,
        "3800",4,
        "3400",3,
        "3480",3,
        "740",2,
        "743",2,
        "2570",2,
        "2770",2,
        "2800",2,
        "3180",2,
        "3700",2,
        "3900",2,
        "4800",2,
        "933",1,
        "1333",1,
        "1714",1,
        "2560",1,
        "2900",1,
        "3380",1,
        "3580",1,
        "3880",1,
        "4200",1,
        "4300",1,
        "5200",1]
    },
    "facet_ranges":{},
    "facet_intervals":{},
    "facet_heatmaps":{}
}

我想您会发现,即使是复杂的搜索,也可以通过直观的参数设定来实现。

聚类 (jū

在SolrCloud的架构下,可以实现集群化。

通过使用zookeeper来集中管理Solr的配置文件和分布式群集信息,提供了分布式索引、分布式搜索、复制、自动故障转移机制。

在SolrCloud中,我们使用“集合”这个概念来处理模式信息、索引、索引数据操作机制。请将其视为独立运行Solr时的“核心”。

暫時先試試看動起來

services:
  solr1:
    image: solr:8.7
    container_name: solr1
    ports:
      - "8981:8983"
    volumes:
      - ./solr1:/var/solr
    environment:
      - ZK_HOST=zk1:2181,zk2:2181,zk3:2181
    networks:
      - solr
    depends_on:
      - zk1
      - zk2
      - zk3

  solr2:
    image: solr:8.7
    container_name: solr2
    ports:
      - "8982:8983"
    volumes:
      - ./solr2:/var/solr
    environment:
      - ZK_HOST=zk1:2181,zk2:2181,zk3:2181
    networks:
      - solr
    depends_on:
      - zk1
      - zk2
      - zk3

  solr3:
    image: solr:8.7
    container_name: solr3
    ports:
      - "8983:8983"
    volumes:
      - ./solr3:/var/solr
    environment:
      - ZK_HOST=zk1:2181,zk2:2181,zk3:2181
    networks:
      - solr
    depends_on:
      - zk1
      - zk2
      - zk3

  zk1:
    image: zookeeper:3.5
    container_name: zk1
    restart: always
    hostname: zk1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
      ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok
    networks:
      - solr

  zk2:
    image: zookeeper:3.5
    container_name: zk2
    restart: always
    hostname: zk2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
      ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok
    networks:
      - solr

  zk3:
    image: zookeeper:3.5
    container_name: zk3
    restart: always
    hostname: zk3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
      ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok
    networks:
      - solr

networks:
  solr:
飼养员存在多个原因之一是因为它的属性是进行集中管理配置,如果只有一台,则会成为单点故障。因此,飼养员自身也提供了集群功能,在实际运营中通常会使用多台来构建。
SolrCloud.png

现在,由于当前情况是没有数据,更没有集合,所以我们马上要开始创建集合并进行数据登记。

# コレクション「solrbook」を作成
curl "http://localhost:8981/solr/admin/collections?action=CREATE&name=solrbook&maxShardsPerNode=2&numShards=2&replicationFactor=3&collection.configName=_default"
# データを登録
curl http://localhost:8981/solr/solrbook/update?commit=true --data-binary @sample-data/sample-books.json -H 'Content-type:application/json'
上述的Collection建立命令的意思是创建一个名为”solrbook”的Collection,将其索引分割为两个shard,一个节点可以管理的最大shard数量为2,将一个shard在三个Solr节点上进行复制的意思。
Screen Shot 2020-12-12 at 23.56.43.png
然而,如果管理碎片的节点全部宕机,则包含在该碎片中的数据将在搜索结果中丢失。在上述例子中,除非所有节点全部宕机,否则不会出现数据丢失的情况,但如果只有一部分节点管理碎片,则存在这种可能性。

因为它能够自动完成许多任务,所以您无需费心繁琐的工作就可以管理集群。

向集群添加节点也很简单。只需启动一个新的Solr节点并将其添加到集群中。在这种情况下,让它专门负责shard1。

curl "http://localhost:8981/solr/admin/collections?action=ADDREPLICA&collection=solrbook&shard=shard1&node=192.168.208.8:8983_solr"
Screen Shot 2020-12-13 at 0.12.58.png

总结

我简单比较了Apache Solr和ElasticSearch,概括了Solr的启动、基本搜索、稍微高级的搜索(高亮搜索、分面搜索)、集群功能(SolrCloud)等基础部分。

由于在这里省略了一些细节,并且还有许多未被介绍的功能,所以对于没有接触过Solr的人来说,希望通过这篇文章能够引起他们的兴趣,并且自己也能够进行一些研究。由于官方文档也非常详尽,所以只需要通过一些基本概念的书籍等途径,然后再参考官方文档,就能够了解大部分内容。

文献引用

「Apache Solr入门-开源全文搜索引擎」第3版改订
solrbook3
docker-solr

bannerAds