Elasticsearch 多索引搜索 多条件筛选 去除重复数据

本文介绍了如何在Elasticsearch中进行多索引搜索,并使用bool查询进行多条件筛选。示例展示了如何针对`media_data_es`和`live_room_es`两个索引,结合`must`、`should`、`filter`选项进行复合查询,同时设置了搜索类型为`dfs_query_then_fetch`,确保不重复。查询条件包括了索引匹配、关键词匹配及状态和审核状态的过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Elasticsearch 多索引搜索 多条件筛选


先看结构 分别是索引media_data_es,live_room_es
search_type :dfs_query_then_fetch 不重复

复合查询
复合查询就是把一些简单查询组合在一起实现更复杂的查询需求,除此之外,复合查询还可以控制另外一个查询的行为。

bool query
bool 查询可以把任意多个简单查询组合在一起,使用 must、should、must_not、filter 选项来表示简单查询之间的逻辑,每个选项都可以出现 0 次到多次,它们的含义如下:

must 文档必须匹配 must 选项下的查询条件,相当于逻辑运算的 AND,且参与文档相关度的评分。
should 文档可以匹配 should 选项下的查询条件也可以不匹配,相当于逻辑运算的 OR,且参与文档相关度的评分。
must_not 与 must 相反,匹配该选项下的查询条件的文档不会被返回;需要注意的是,must_not 语句不会影响评分,它的作用只是将不相关的文档排除。
filter 和 must 一样,匹配 filter 选项下的查询条件的文档才会被返回,但是 filter 不评分,只起到过滤功能,与 must_not 相反。
在这里插入图片描述

{
  
    "index": "media_data_es,live_room_es",
    "from": 0,
    "size": 15,
    "preference": "media_data_es,live_room_es",
    "search_type": "dfs_query_then_fetch",
    "body": {
        "query": {
            "bool": {
                "minimum_should_match": 1,
                "should": [
                    {
                        "bool": {
                            "must": [
                                {
                                    "term": {
                                        "_index": {
                                            "value": "media_data_es"
                                        }
                                    }
                                },
                                {
                                    "match": {
                                        "key_text": "看看就好了"
                                    }
                                }
                            ],
                            "filter": [
                                {
                                    "term": {
                                        "status": 1
                                    }
                                },
                                {
                                    "term": {
                                        "audit_status": 1
                                    }
                                }
                            ]
                        }
                    },
                    {
                        "bool": {
                            "must": [
                                {
                                    "term": {
                                        "_index": {
                                            "value": "live_room_es"
                                        }
                                    }
                                },
                                {
                                    "match": {
                                        "key_text": "看看就好了"
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        }
    }
}

我这里用的是SDK

“hyperf/elasticsearch”: “~2.2.0”,

如果是HTTP

POST请求
地址

/media_data_es%2Clive_room_es/_search

params数据

Array
(
    [from] => 0
    [size] => 15
    [preference] => media_data_es,live_room_es
    [search_type] => dfs_query_then_fetch
)

Body数据

Array
(
    [query] => Array
        (
            [bool] => Array
                (
                    [minimum_should_match] => 1
                    [should] => Array
                        (
                            [0] => Array
                                (
                                    [bool] => Array
                                        (
                                            [must] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [term] => Array
                                                                (
                                                                    [_index] => Array
                                                                        (
                                                                            [value] => media_data_es
                                                                        )

                                                                )

                                                        )

                                                    [1] => Array
                                                        (
                                                            [match] => Array
                                                                (
                                                                    [key_text] => 看看就好了
                                                                )

                                                        )

                                                )

                                            [filter] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [term] => Array
                                                                (
                                                                    [status] => 1
                                                                )

                                                        )

                                                    [1] => Array
                                                        (
                                                            [term] => Array
                                                                (
                                                                    [audit_status] => 1
                                                                )

                                                        )

                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [bool] => Array
                                        (
                                            [must] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [term] => Array
                                                                (
                                                                    [_index] => Array
                                                                        (
                                                                            [value] => live_room_es
                                                                        )

                                                                )

                                                        )

                                                    [1] => Array
                                                        (
                                                            [match] => Array
                                                                (
                                                                    [key_text] => 看看就好了
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

Options 数据

Array
(
)
<think>嗯,用户想简化系统中的搜索条件以提高效率。首先,我需要理解他们的问题背景。可能他们的系统现在有太多复杂的搜索条件,导致查询速度变慢或者用户体验不好。那要怎么简化呢? 根据提供的引用资料,引用[3]提到如果业务对排序要求不多,可以采用某些方案,但如果有排序需求,方案一更高效。这可能涉及到数据库查询优化或者使用搜索引擎如ElasticSearch。所以可能的方向包括优化现有查询、使用更高效的数据结构或者索引,或者引入专门的搜索工具。 引用[1]说高效搜索依赖算法优化、硬件支持和数据处理技术。所以可能需要检查现有的搜索算法是否有优化空间,比如是否使用了合适的索引,或者是否有冗余的条件可以合并。引用[2]提到的四叉树在GIS中的应用,可能类比到其他类型的索引结构,比如数据库中的B树或者哈希索引,来加快查询速度。 另外,引用[4]提到了系统的健壮性,可能需要在简化条件的同时确保系统稳定,不会因为简化而出现错误或漏洞。所以简化应该是合理的,不影响功能。 可能的步骤包括: 1. 分析现有搜索条件的使用频率和必要性,去除冗余或不常用的条件。 2. 合并相似的条件,减少用户的选择负担。 3. 优化数据库索引,比如添加复合索引或使用覆盖索引。 4. 引入缓存机制,存储常用搜索的结果,减少数据库压力。 5. 使用搜索引擎如ElasticSearch来处理复杂查询,特别是当有多个排序条件时。 6. 提供智能提示或自动补全,减少用户输入时间,间接提高效率。 7. 采用异步加载,让用户先看到部分结果,再逐步加载更多数据。 需要确保这些步骤不会影响系统的健壮性,比如缓存机制要考虑数据一致性,索引优化要考虑写入性能的影响。同时,用户体验方面,简化条件应该让用户更容易找到所需信息,而不是减少功能的可用性。 可能还需要考虑用户权限,某些条件是否需要根据用户角色显示或隐藏,进一步简化界面。另外,后端可以预处理一些条件,比如默认时间范围或常用筛选,减少用户需要手动输入的步骤。 最后,测试优化后的系统,监控性能指标,确保效率提升且没有引入新问题。</think>### 分步解决方案:简化系统搜索条件以提高效率 #### 1. **分析并优化搜索条件逻辑** - **去除冗余条件**:合并功能重复的筛选条件。例如,“创建时间”和“最后修改时间”若存在重叠逻辑,可整合为动态时间范围选择。 - **默认常用条件**:根据用户行为数据(如引用[3]中提到的“客户最后下单时间”),将高频使用的条件设为默认值,减少用户操作步骤。 - **示例**:将“近30天数据”设为时间筛选的默认选项,避免每次手动选择。 #### 2. **引入高效索引技术** - **数据库索引优化**:对高频查询字段(如ID、时间戳)添加复合索引。例如,对`(最后修改时间, 状态)`建立联合索引,加速多条件查询。 - **空间索引应用**:借鉴引用[2]中四叉树的思想,对地理数据或分层数据采用空间索引结构,减少全表扫描开销。 - **代码示例**(SQL索引): ```sql CREATE INDEX idx_order_time_status ON orders (last_modified_time, status); ``` #### 3. **分层加载与异步查询** - **核心条件优先加载**:首次查询仅触发必要字段的搜索(如关键词、时间范围),其他条件(如分类标签、状态)通过异步加载动态补充。 - **示例**:电商系统先按“商品名称”和“价格区间”返回结果,再后台加载“品牌”和“评分”筛选项。 #### 4. **集成搜索引擎优化** - **使用ElasticSearch**:如引用[3]所述,对需要复杂排序(如综合评分、多维度权重)的场景,将查询迁移至ElasticSearch,利用倒排索引和分词加速搜索。 - **配置示例**: ```json { "query": { "bool": { "must": [ { "match": { "title": "手机" }}, { "range": { "price": { "gte": 1000, "lte": 5000 }}} ] } }, "sort": [{"sales_volume": "desc"}, {"rating": "desc"}] } ``` #### 5. **智能交互设计** - **输入联想与自动补全**:对关键词搜索字段(如商品名称、用户ID)提供自动补全功能,减少输入错误和查询延迟。 - **条件折叠与分组**:将低频条件(如高级筛选)折叠到“更多选项”中,保持界面简洁(符合引用[4]对系统可访问性的要求)。 #### 6. **缓存与预加载** - **高频结果缓存**:对无实时性要求的查询(如热门商品列表),设置Redis缓存,有效期5-10分钟。 - **预加载关联数据**:在用户选择“分类”时,后台预加载该分类下的“品牌”列表,减少后续交互等待时间。 --- ### 相关问题 1. 如何评估搜索条件简化后的系统性能提升? 2. ElasticSearch与传统数据库在复杂查询中的性能差异具体体现在哪些方面? 3. 如何平衡搜索条件简化与功能完整性之间的矛盾? 4. 空间索引(如四叉树)在非地理数据场景中是否有适用性? [^1]: 引用[1] [^2]: 引用[2] [^3]: 引用[3] [^4]: 引用[4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值