Elasticsearch Nest - 搜索动态数据

时间:2018-05-04 09:41:44

标签: c# .net elasticsearch nest

我有一个索引是从一个相当简单的模型中自动化的。

唯一的复杂性是动态值列表,用户可以在其中创建自己的数据。每个值都有一个Title(数据是什么)和Value。例如,数组中的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。

问题在于我想要搜索其中一种动态类型。假设我搜索姓氏“托马斯”。我添加了2个“必须”搜索:

  • Title = Surname
  • 价值=托马斯

或者

  • q = dynamicTextValues.title:Surname AND dynamicTextValues.value:Thomas

这不起作用,因为这两个字段彼此独立。它实际上将返回记录,其中任何值是托马斯(例如托马斯也是名字),只要它在同一记录中的某处包含姓氏的标题。我需要它只返回Value是Thomas在标题为Surname的同一列表项上。

有什么办法可以做到吗?或者是否有更好的方法来构建我的数据以实现这些结果?我认为(作为一个黑客)连接标题和值并搜索“姓氏托马斯”但这不能解决数字和日期字段的问题。

1 个答案:

答案 0 :(得分:1)

DynamicTextValue需要映射为nested data type才能生效。 nested数据类型在内部映射为单独的文档,在这种情况下维护属性titlevalue之间的关系。