返回

Python 入门教程:轻松玩转 Elasticsearch 搜索与过滤

后端

玩转 Elasticsearch 搜索与过滤:Python 入门指南

在当今信息爆炸的时代,快速而高效地查找相关信息变得至关重要。Elasticsearch,一个基于 Lucene 的开源搜索引擎,应运而生,以其分布式、可扩展、高可靠性和实时性等特性脱颖而出。掌握 Elasticsearch 中的搜索和过滤技术,无疑能极大提高信息检索效率。

分页:分块浏览,轻松掌控

面对海量搜索结果,分页功能显得尤为必要。Elasticsearch 提供多种分页方式,满足不同需求。

一种常见方式是使用 fromsize 参数。from 指定分页起始位置,size 指定每页显示条数。例如:

from elasticsearch import Elasticsearch

es = Elasticsearch()

res = es.search(
    index="my_index",
    body={
        "from": 10,
        "size": 20
    }
)

另一种方式是使用游标,标识当前分页位置。下一次分页只需指定上一次游标即可。

from elasticsearch import Elasticsearch

es = Elasticsearch()

res = es.search(
    index="my_index",
    body={
        "scroll": "1m",
        "size": 20
    }
)

scroll_id = res['_scroll_id']

while True:
    res = es.scroll(
        scroll_id=scroll_id,
        scroll="1m"
    )

    if len(res['hits']['hits']) == 0:
        break

过滤:精准出击,直达目标

为了更精准地定位所需信息,Elasticsearch 提供了多种过滤方式。

布尔查询通过 AND、OR、NOT 等逻辑运算符组合多个查询条件。例如,搜索标题包含 "python" 且内容包含 "elasticsearch" 的文档:

from elasticsearch import Elasticsearch

es = Elasticsearch()

res = es.search(
    index="my_index",
    body={
        "query": {
            "bool": {
                "must": [
                    {"match": {"title": "python"}},
                    {"match": {"content": "elasticsearch"}}
                ]
            }
        }
    }
)

范围查询则根据字段值过滤结果。例如,搜索发布时间在指定时间段内的文档:

from elasticsearch import Elasticsearch

es = Elasticsearch()

res = es.search(
    index="my_index",
    body={
        "query": {
            "range": {
                "publish_date": {
                    "gte": "2023-01-01",
                    "lte": "2023-12-31"
                }
            }
        }
    }
)

除此之外,Elasticsearch 还提供了正则表达式查询、近似查询、模糊查询、词组查询和通配符查询等多种过滤方式,满足不同需求。

排序:由浅入深,层层递进

为了呈现最相关或重要的结果,排序功能不可或缺。

相关性排序根据文档与查询条件的关联度排序。例如:

from elasticsearch import Elasticsearch

es = Elasticsearch()

res = es.search(
    index="my_index",
    body={
        "sort": [
            {"_score": {"order": "desc"}}
        ]
    }
)

字段排序则根据指定字段值排序。例如,按发布时间降序排序:

from elasticsearch import Elasticsearch

es = Elasticsearch()

res = es.search(
    index="my_index",
    body={
        "sort": [
            {"publish_date": {"order": "desc"}}
        ]
    }
)

Elasticsearch 还提供了脚本排序和地理位置排序等多种排序方式。

高亮显示:锦上添花,一触即发

高亮显示可以突出显示搜索结果中与查询条件匹配的内容,增强可读性。

HTML 高亮显示在匹配内容周围添加 HTML 标签,在浏览器中显示高亮效果:

from elasticsearch import Elasticsearch

es = Elasticsearch()

res = es.search(
    index="my_index",
    body={
        "highlight": {
            "fields": {
                "title": {},
                "content": {}
            }
        }
    }
)

片段高亮显示则在匹配内容周围添加片段,在终端中显示高亮效果:

from elasticsearch import Elasticsearch

es = Elasticsearch()

res = es.search(
    index="my_index",
    body={
        "highlight": {
            "fields": {
                "title": {},
                "content": {}
            },
            "fragment_size": 100
        }
    }
)

Elasticsearch 还提供了统一高亮显示和自定义高亮显示等多种方式。

结论

掌握 Elasticsearch 中的搜索和过滤技术,犹如手持利器,让你在信息海洋中畅游自如,快速高效地找到所需内容。掌握了分页、过滤、排序和高亮显示等核心功能,你就能游刃有余地驾驭 Elasticsearch,开启高效信息检索之旅。

常见问题解答

  • Elasticsearch 的优势是什么?

    • 分布式、可扩展、高可靠性和实时性。
  • 如何进行分页?

    • 使用 fromsize 参数或游标。
  • 如何过滤搜索结果?

    • 使用布尔查询、范围查询等多种过滤方式。
  • 如何对搜索结果排序?

    • 使用相关性排序、字段排序等多种排序方式。
  • 如何高亮显示搜索结果?

    • 使用 HTML 高亮显示、片段高亮显示等多种高亮显示方式。