【发布时间】:2019-02-27 00:10:05
【问题描述】:
给定这个索引模型类:
public class ProductIndexModel
{
public Guid Id { get; set; }
public DateTime Created { get; set; }
public string Name { get; set; }
public JObject DynamicContent { get; set; }
}
我正在努力做到以下几点:
- 将整个对象存储在 Elasticsearch 中
- 索引所有属性,除了
DynamicContent属性 - 查询时,检索整个对象(包括
DynamicContentprop)
我不索引 DynamicContent 属性的原因是,它是一个 json-blob,偶尔会有不同类型的属性路径之间发生冲突(例如对象与字符串、int 与字符串等) )。例如,尝试使用 2 个对象来索引路径 /dynamiccontent.id,其中 value 分别为 int 和 string 类型可能会给我:
错误:类型:mapper_parsing_exception 原因:“解析失败 [dynamiccontent.id]" CausedBy:类型:json_parse_exception 原因: “当前令牌 (START_OBJECT) 不是数字,不能使用数值 访问器
我是这样创建索引的:
var createIndexResponse = await _elasticClient.CreateIndexAsync(indexName, c => c
.InitializeUsing(settingsState)
.Mappings(ms => ms
.Map<ProductIndexModel>(m => m
.AutoMap()
)
)
);
settingsState 的类型为 Nest.IndexState,带有一些标记器等等,这与问题无关。
ISearchRequest SearchRequest(SearchDescriptor<ProductIndexModel> x) => x
.Index(indexName)
.Query(q => q.Bool(bq => bq.Filter(filters)))
.From(filter.Offset)
.Size(filter.PageSize)
;
var searchResponse = await _elasticClient.SearchAsync<ProductIndexModel>(SearchRequest);
filters 是一个动态构造的通用过滤器列表,用于减少结果。
所以我想保持DynamicContent 未编入索引,但在查询时仍然能够获取其(原始)内容。
我试图用 Nest.IgnoreAttribute 注释 DynamicContent 完全忽略它,因此在检索时导致空值。关于如何使用 NEST “存储”值而不是索引它的任何建议?
【问题讨论】:
标签: elasticsearch nest