ES 操作

1、删除索引的所有记录

复制代码
curl -X POST "localhost:9200/<index-name>/_delete_by_query" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match_all": {}
  }
}
'

POST /content_erp_nlp_help/_delete_by_query

{

"query": {

"match_all": {}

}

}

2、创建索引模板

PUT _template/content_erp_nlp_help

{

"index_patterns": [

"content_vector*"

],

"settings": {

"analysis": {

"analyzer": {

"my_ik_analyzer": {

"type": "ik_smart"

}

}

},

"number_of_shards": 1

},

"mappings": {

"properties": {

"id": {

"type": "long"

},

"content": {

"type": "text",

"analyzer": "ik_max_word",

"search_analyzer": "ik_smart"

},

"content_vector": {

"type": "dense_vector",

"similarity": "cosine",

"index": true,

"dims": 768,

"element_type": "float",

"index_options": {

"type": "hnsw",

"m": 16,

"ef_construction": 128

}

},

"content_answer": {

"type": "text",

"analyzer": "ik_max_word",

"search_analyzer": "ik_smart"

},

"title": {

"type": "text",

"analyzer": "ik_max_word",

"search_analyzer": "ik_smart"

},

"param": {

"type": "text",

"analyzer": "ik_max_word",

"search_analyzer": "ik_smart"

},

"type": {

"type": "text",

"analyzer": "ik_max_word",

"search_analyzer": "ik_smart"

}

}

}

}

3

使用must还是should在布尔查询中取决于你的具体需求和期望的查询行为。

使用 must

当你使用must时,所有包含在must列表中的子查询都必须匹配。这意味着,为了使文档成为搜索结果的一部分,文档必须同时满足所有must查询的条件。如果你的意图是找到同时与文本查询和KNN向量查询匹配的文档,那么使用must是合适的。这通常用于要求严格的匹配场景,比如需要文档同时具有特定的文本特征和与某向量相近。

使用 should

相比之下,should表示查询中的任意子查询匹配即可。如果至少有一个should子查询匹配,那么文档就会被视为匹配。这提供了更大的灵活性,意味着即使文档只满足文本查询或KNN查询中的一个,它也可能出现在结果中。这对于希望扩大搜索范围,或者允许部分条件匹配的情况非常有用。

效果比较

  • 精确性 vs. 宽泛性 : must查询倾向于提供更精确的结果集,因为所有条件都必须满足。而should查询可能产生更宽泛的结果,因为它允许部分条件匹配。
  • 性能影响 : 在某些情况下,使用should可能会导致更多的文档被扫描和评估,从而可能略微降低查询性能。这是因为Elasticsearch需要检查每个should子查询是否匹配。

混合使用 mustshould

在很多情况下,混合使用mustshould可以达到最佳的效果。例如,你可以定义一些硬性条件作为must,确保结果至少满足这些核心需求,同时使用should来增加结果的丰富度和多样性,如:

复制代码

Java

复制代码
1BoolQuery boolQuery = new BoolQuery.Builder()
2                .must(matchQuery) // 必须满足的文本匹配
3                .should(knnQuery) // 可以满足的向量相似性
4                .build();

在这个例子中,所有结果必须与文本查询匹配,但如果文档还与KNN查询匹配,则会获得更高的相关性评分,从而可能在结果中排名更高。

总结

选择使用must还是should主要取决于你的业务逻辑和你对查询结果的期望。如果你需要严格的匹配条件,使用must;如果你希望结果更加宽泛和多样化,使用should;如果你需要两者之间的平衡,考虑混合使用两者。

相关推荐
l1m0_几秒前
智能电动自行车管理后台实战:AI生成页面与React组件化技巧
前端·react.js·ui·ai·设计
Patrick_Wilson16 分钟前
为什么gitlab的MR会默认有一个merge commit
前端·git·gitlab
霸道流氓气质21 分钟前
Spring AI 多模态开发指南:图片理解与语音合成
java·人工智能·spring
en.en..26 分钟前
Linux mmap 内存映射深度解析:基于帧缓冲 /dev/fb0
java·服务器·前端
洋不写bug28 分钟前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
深海鱼肝油ya29 分钟前
向量数据库Elasticsearch(一)
人工智能·elasticsearch·向量数据库·es数据库增加索引·es数据库相似度查询·knn查询
后台模板学习32 分钟前
用 IM 即时聊天项目一次讲清消息去重算法的踩坑与解决方案
java·数据库·spring
秋名RG33 分钟前
2026/6/15 系统故障复盘与整改方案
java·架构
今天要早睡_36 分钟前
C++ 核心语法速过:命名空间、引用、函数重载与 nullptr 深度解析
android·java·c++
南讯股份Nascent39 分钟前
2026年CRM技术选型观察:当“数据打通“成为第一需求,电商CRM的架构价值在哪里
java·大数据·用户运营