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:


curl http://localhost:8983/solr/solrbook/update?commit=true --data-binary @sample-data/sample-books.json -H 'Content-type:application/json'

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

如果指定了查询参数,将以类似的方式显示与管理界面相同的结果。
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:

现在,由于当前情况是没有数据,更没有集合,所以我们马上要开始创建集合并进行数据登记。
# コレクション「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'

因为它能够自动完成许多任务,所以您无需费心繁琐的工作就可以管理集群。
向集群添加节点也很简单。只需启动一个新的Solr节点并将其添加到集群中。在这种情况下,让它专门负责shard1。
curl "http://localhost:8981/solr/admin/collections?action=ADDREPLICA&collection=solrbook&shard=shard1&node=192.168.208.8:8983_solr"

总结
我简单比较了Apache Solr和ElasticSearch,概括了Solr的启动、基本搜索、稍微高级的搜索(高亮搜索、分面搜索)、集群功能(SolrCloud)等基础部分。
由于在这里省略了一些细节,并且还有许多未被介绍的功能,所以对于没有接触过Solr的人来说,希望通过这篇文章能够引起他们的兴趣,并且自己也能够进行一些研究。由于官方文档也非常详尽,所以只需要通过一些基本概念的书籍等途径,然后再参考官方文档,就能够了解大部分内容。
文献引用
「Apache Solr入门-开源全文搜索引擎」第3版改订
solrbook3
docker-solr