この記事はTLB Enjoy Developers Advent Calendar 2022 の23日目の記事です。
はじめに
全文検索エンジンというとApache SolrとElasticsearchをよく耳にしますが
クエリ構文の違いをサンプルで比較するような記事があまりなかったので書いてみました。
この記事を読むとわかること
ざっくりApache SolrとElasticsearchで検索クエリはこんな感じで違うんだ〜となります。
そもそもApache SolrとElasticsearchとは
どちらもLuceneライブラリをベースとしたオープンソースの検索エンジンです。
大量のデータのインデックス作成、検索、分析に使用することができます。
何が違うのか
いろいろ違いはありますが、主な違いの一つとして挙げられるのがクエリの構文です。
ElasticsearchはJSONベースのクエリ構文を採用しており、全文検索、フィルタリング、集計など、さまざまな検索条件を指定することができます。
一方、Apache Solrは「Lucene Query Syntax」と呼ばれる、検索ライブラリ「Lucene」をベースとしたクエリ構文を採用しています。
Elasticsearchの構文と似ていますが、Googleなどの従来の検索エンジンに慣れ親しんでいるユーザーにとっては、より馴染みやすい構文と言えるかもしれません。
クエリのサンプルで比較してみます
同じ内容で検索する時、Apache SolrとElasticsearchでどう違うのかサンプルで比較しています。
全文検索
titleでキーワード「はらぺこあおむし」を検索する場合
q=title:はらぺこあおむし
{
"query": {
"match": {
"title": "はらぺこあおむし"
}
}
}
範囲検索
priceの値を「100以上200以下」で検索する場合
q=price:[100 TO 200]
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 200
}
}
}
}
並べ替え検索
priceを「昇順」、date_publishedを「降順」でソートする場合
q=*:*&sort=price asc, date_published desc
{
"query": {
"match_all": {}
},
"sort": [
{ "price": "asc" },
{ "date_published": "desc" }
]
}
フィルター検索
titleに「はらぺこあおむし」というキーワードを含み、priceが「100〜200」のデータを検索したい場合
q=title:はらぺこあおむし&fq=price:[100 TO 200]
{
"query": {
"bool": {
"must": {
"match": {
"title": "はらぺこあおむし"
}
},
"filter": {
"range": {
"price": {
"gte": 100,
"lte": 200
}
}
}
}
}
}
複合検索
title「はらぺこあおむし」というキーワードを含み、
priceが「100〜200」、
categoryに「novel」を含まない、
authorが「エリック・カール」または「eric carle」のデータを検索したい場合
q=title:はらぺこあおむし AND price:[100 TO 200] AND NOT category:novel AND (author:エリック・カール OR author:eric carle)
{
"query": {
"bool": {
"must": [
{ "match": { "title": "はらぺこあおむし" } },
{ "range": { "price": { "gte": 100, "lte": 200 } } }
],
"must_not": {
"match": { "category": "novel" }
},
"should": [
{ "match": { "author": "エリック・カール" } },
{ "match": { "author": "eric carle" } }
]
}
}
}
終わりに
あっという間に年末ですね。
クリスマスが近いのでクリスマスっぽい絵本探したら「はらぺこあおむし」になりました。
明日24日クリスマスイブは@kdr250さんの記事です!