我总结了Apache Solr和Elasticsearch查询语法的不同之处

这篇文章是TLB Enjoy开发者圣诞日历2022的第23天的文章。

首先

因为经常听到全文搜索引擎的是Apache Solr和Elasticsearch,但很少看到有关比较其查询语法差异的示例文章,所以我写了一篇来试试看。

阅读这篇文章就可以理解的事情。

大致上,在Apache Solr和Elasticsearch中,搜索查询的方式有所不同哦~

首先,Apache Solr和Elasticsearch是什么?

这两个搜索引擎都是基于Lucene库的开源搜索引擎,可用于创建、搜索和分析大量数据的索引。

有什么不同之处

虽然有很多不同之处,但其中一个主要的区别可以是查询语句的语法。
Elasticsearch采用基于JSON的查询语法,可以指定各种搜索条件,如全文搜索、过滤、聚合等。
另一方面,Apache Solr采用基于搜素库”Lucene”的查询语法称为”Lucene Query Syntax”。
虽然与Elasticsearch的语法相似,但对于熟悉传统搜索引擎如Google的用户来说,可能更容易上手。

我们来比较一下查询样例。

我们正在通过示例比较Apache Solr和Elasticsearch在进行相同内容搜索时的区别。

整个文档搜索

如果要在标题中搜索关键词“饥饿的毛虫”,

q=title:はらぺこあおむし
{
  "query": {
    "match": {
      "title": "はらぺこあおむし"
    }
  }
}

范围搜索

如果以「100以上200以下」作为条件搜索价格的值的话

q=price:[100 TO 200]

{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 200
      }
    }
  }
}

排序搜索

如果以价格“升序”、发布日期“降序”进行排序的话。

q=*:*&sort=price asc, date_published desc

{
  "query": {
    "match_all": {}
  },
  "sort": [
    { "price": "asc" },
    { "date_published": "desc" }
  ]
}

筛选搜索

如果想要在标题中包含关键词“饿虫饿得慌”并且价格在“100至200”之间的数据,请进行搜索。

q=title:はらぺこあおむし&fq=price:[100 TO 200]

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "title": "はらぺこあおむし"
        }
      },
      "filter": {
        "range": {
          "price": {
            "gte": 100,
            "lte": 200
          }
        }
      }
    }
  }
}

多重搜索

如果想要搜索包含标题关键词为「饿了吗的小毛虫」,价格在「100〜200」之间,不包含类别为「小说」的数据,并且作者为「艾利克·卡尔」或「埃里克·卡尔」的情况。

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的文章将会发布!

广告
将在 10 秒后关闭
bannerAds