将标签存储到ElasticSearch中

本文关键字:ElasticSearch 存储 标签 | 更新日期: 2023-09-27 18:30:01

我有一个ElasticSearch数据库,我在其中存储简单的用户生成的字符串(也称为消息)。每个字符串都可以附加多个标签。标签的总数是先验的,但可能会随着时间的推移而增加(我不想把我锁在外面,以防我觉得需要创建新的消息标签,即我不想重新索引我的整个数据库来添加新标签)。

现在,系统应该能够对消息执行自由文本搜索(这几乎是ElasticSearch免费提供的),并搜索具有特定标签(或标签子集)的消息。

定义ES文档的最佳方式是什么?目前,我主要关心实现NEST查询的最简单方法

请注意,搜索应在ES级别执行,而不是在应用程序级别执行!我不想检索所有的消息,然后根据我的业务逻辑手动过滤掉它们。

我能想到的可能选择:

  • 标签Id列表
  • 标签名称列表(实际标签名称)
  • 位字段(第i个标签存在=第i个位设置,第i个标记不存在=第i个位清除)(ES本身支持逐位操作吗?)

我当前的文档:

[ElasticType(Name = "Message")]
public class MessageRecord
{
    [ElasticProperty(Store = false, Index = FieldIndexOption.Analyzed)]
    public string Message { get; set; }
    [ElasticProperty(Store = false, Index = FieldIndexOption.No)]
    public List<int> CatList { get; set; }
}

将标签存储到ElasticSearch中

Elasticsearch也可以对数组进行索引。所以,如果你有一个文件如下:

{ 
  stringContent: "Some string content",
  tags: ["important", "revisit", "elasticsearch"]
}

您将能够使用标签对此进行搜索。Elasticsearch将数组的每个元素与文档进行映射。

当谈到更新时,请注意Elasticsearch是NRT(近实时)。您可以更新文档,弹性搜索随后会更新文档并重新索引文档(不是整个索引)。