【问题标题】:Elasticsearch Nest - Searching on Dynamic DataElasticsearch Nest - 搜索动态数据
【发布时间】: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


    【解决方案1】:

    DynamicTextValue 需要映射为nested data type 才能工作。 nested 数据类型在内部映射为单独的文档,维护属性之间的关系,在本例中为 titlevalue

    【讨论】:

    • 这正是我所需要的!你是明星,伙计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多