Elasticsearch (ES) 和 MeiliSearch 是两种流行的搜索引擎,它们在功能、性能和使用场景上有一些显著的区别。以下是它们的一些对比:
1. 架构与设计
-
Elasticsearch:
- 基于Apache Lucene构建,是一个分布式、RESTful风格的搜索和分析引擎。
- 设计用于处理大规模的数据集,支持复杂的搜索需求和实时分析。
- 提供强大的全文搜索、过滤、聚合和分析功能。
-
MeiliSearch:
- 轻量级、开箱即用的搜索引擎,专注于速度和易用性。
- 设计用于快速构建搜索体验,特别适合需要快速响应和简单设置的应用。
- 提供自然语言处理和自动化的搜索排名。
2. 性能与扩展性
-
Elasticsearch:
- 非常适合处理大规模数据和复杂查询。
- 支持分片和多节点集群,以实现高可用性和水平扩展。
- 适合需要高吞吐量和低延迟的企业级应用。
-
MeiliSearch:
- 以速度和简便性为核心,适合中小规模的数据集。
- 不支持分布式集群,通常用于单节点部署。
- 适合需要快速开发和部署的项目。
3. 功能特性
-
Elasticsearch:
- 提供复杂的查询DSL,支持多种搜索和分析功能。
- 支持地理搜索、时间序列分析和机器学习等高级功能。
- 丰富的插件和扩展生态系统。
-
MeiliSearch:
- 提供简单的API,易于集成和使用。
- 支持自动补全、拼写纠正和同义词处理。
- 重点在于提供出色的默认搜索体验。
4. 使用场景
-
Elasticsearch:
- 适用于需要处理大规模数据的场景,如日志分析、商业智能、实时监控等。
- 常用于企业级应用,特别是需要复杂搜索和分析的场景。
-
MeiliSearch:
- 适合需要快速实现搜索功能的场景,如电商网站、博客搜索等。
- 适合开发者希望快速集成搜索功能,而不需要复杂配置的情况。
5. 社区与支持
-
Elasticsearch:
- 拥有庞大的用户社区和丰富的文档资源。
- 商业支持由Elastic公司提供。
-
MeiliSearch:
- 也有活跃的社区支持,文档清晰易懂。
- 提供商业支持和托管服务选项。
选择使用哪个搜索引擎,通常取决于你的具体需求、数据规模和技术栈。如果需要处理大规模数据和复杂查询,Elasticsearch可能更适合;而如果更注重开发速度和简单性,MeiliSearch可能是一个不错的选择。
问题1:没有apiKey的Config构造,使用时候的报错
Java会报错 Golang则不会 可以不设置apiKey
@Configuration
public class MeiliSearchConfig {
@Bean
public Client meiliSearchClient() {
String meiliSearchHostUrl = "http://localhost:7700"; // 替换为你的 MeiliSearch 服务器地址
String meiliSearchApiKey = ""; // 如果设置了 API 密钥,则在此处填写
return new Client(new Config(meiliSearchHostUrl, meiliSearchApiKey));
}
}
goland创建客户端
func main() {
client := meilisearch.New("http://localhost:7700")
}
apiKey参考的获取请参考官网
https://www.meilisearch.com/docs/learn/security/basic_security
问题2:addDocuments的值没有id的话,不会报错,但是实际没有添加成功
golang
func main() {
// 使用新版本 SDK 创建 MeiliSearch 客户端
client := meilisearch.New("http://localhost:7700", meilisearch.WithAPIKey("a1234qqq"))
// 读取本地 JSON 文件
data, err := ioutil.ReadFile("Sft-instruction-sample.json")
if err != nil {
log.Fatalf("读取文件错误: %v", err)
}
// 解析 JSON 数据
var sfts []Sft
err = json.Unmarshal(data, &sfts)
if err != nil {
log.Fatalf("解析 JSON 错误: %v", err)
}
for i := range sfts {
sfts[i].ID = i + 1
}
// 将数据添加到 MeiliSearch
index := client.Index("sft")
_, err = index.AddDocuments(sfts)
if err != nil {
log.Fatalf("添加文档错误: %v", err)
}
// 查询 MeiliSearch
searchResponse, err := index.Search("描述", &meilisearch.SearchRequest{
Limit: 10,
})
if err != nil {
log.Fatalf("查询错误: %v", err)
}
// 打印查询结果
fmt.Println("查询结果:")
for _, hit := range searchResponse.Hits {
fmt.Printf("id: %v,instruction: %v, input: %v,output: %v\n", hit.(map[string]interface{})["id"], hit.(map[string]interface{})["instruction"], hit.(map[string]interface{})["input"], hit.(map[string]interface{})["output"])
}
}
Java
public void addDocumentTest() throws MeilisearchException {
Index index = meiliSearchClient.index("aaaa");
// 添加的对象必须有id 否则不能录入数据
String[] documents = new String[]{
"{ \"id\": 1, \"title\": \"The Shawshank Redemption\" }",
"{ \"id\": 2, \"title\": \"The Godfather\" }"
};
index.addDocuments(Arrays.toString(documents));
}