【发布时间】:2018-05-04 19:56:21
【问题描述】:
我有一个从相当简单的模型自动映射的索引。
唯一的复杂性是用户可以创建自己的数据的动态值列表。每个值都有一个标题(数据是什么)和一个值。例如,数组中的 2 项可能是:
项目 1
- 职称 - 名字
- 价值 - 约翰
项目 2
- 职称 - 姓氏
- 价值 - 托马斯
可能有很多,我们不知道它们会是什么。用户可以在 CMS 中添加它们。
我的课程看起来像这样:
public class SearchRequest
{
public int DocumentId { get; set; }
public string DocumentName { get; set; }
public List<DynamicTextValue> DynamicTextValues { get; set; }
}
public class DynamicTextValue
{
public string Title { get; set; }
public string Value { get; set; }
}
通用映射如下所示:
"documentId": {
"type": "integer"
},
"documentName": {
"type": "text"
},
"dynamicTextValues": {
"properties": {
"value": {
"type": "text"
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
我也有类似概念的dynamicNumericValues和dynamicDateValues。
问题是当我想搜索其中一种动态类型时。假设我搜索姓氏“Thomas”。我添加了 2 个“必须”搜索:
- 职称 = 姓氏
- 价值 = 托马斯
或者
- q=dynamicTextValues.title:Surname AND dynamicTextValues.value:Thomas
这不起作用,因为这两个字段彼此独立。它实际上会返回任何值为 Thomas 的记录(例如,Thomas 也是一个名字),只要它在同一记录中的某处包含带有姓氏的标题。我需要它只返回在 Title 是 Surname 的同一列表项中 Value 是 Thomas 的地方。
有什么办法可以做到吗?或者有没有更好的方法来构建我的数据以实现这些结果?我考虑过(作为一种技巧)连接标题和值并搜索“姓氏 Thomas”,但这并不能解决数字和日期字段的问题。
【问题讨论】:
标签: c# .net elasticsearch nest