【问题标题】:How best to address index property sub-fields in NEST?如何最好地处理 NEST 中的索引属性子字段?
【发布时间】:2015-01-07 11:29:35
【问题描述】:

我正在努力研究如何最好地让 NEST 驱动 Elastic 在多字段属性的子字段中进行搜索,如果可能的话,不要对查询中的字段名称进行硬编码。

一些解释...

我们有一个 POCO 业务对象,其中包含一些字段,我们知道这些字段可能是有些复杂的字母数字字符串,有时带有符号、标点符号和空格,用户可能会在没有修饰的情况下搜索这些字段,并且通常以相当部分的方式进行搜索。

例如,项目代码可能类似于“X123.45-10”,但用户可能只能记住“它以 '4510' 结尾”。为了找到这些,我们创建了一个具有多个字段的字符串属性的索引,每个字段的分析方式不同,即带有和不带有非字母字符的 ngrammed:

client.CreateIndex(Elasticsearchindex, c => c
  .Analysis(a => a.Analyzers(az1 => az1.Add("ngram_analyzer", ngramAnalyser)))
  .Analysis(a => a.Analyzers(az1 => az1.Add("compressedNgramAnalyser", compressedNgramAnalyser)))
  .AddMapping<ItemBo>(m => m.MapFromAttributes()
    .Properties(props => props
      .MultiField(s => s
        .Name(p => p.ItemCode)
        .Fields(pprops => pprops
          .String(ps => ps.Name(p => p.ItemCode).Index(FieldIndexOption.Analyzed).Analyzer("default"))
          .String(ps => ps.Name("ngram").Index(FieldIndexOption.Analyzed).IndexAnalyzer("ngram_analyzer"))
          .String(ps => ps.Name("compressedNgram").Index(FieldIndexOption.Analyzed).IndexAnalyzer("compressedNgramAnalyser"))
        )
      )
    )
  )
);

这给了我们索引属性...

"itemCode": {
  "type": "string",
  "fields": {
    "ngram": {
      "type": "string",
      "index_analyzer": "ngram_analyzer"
    },
    "compressedNgram": {
      "type": "string",
      "index_analyzer": "compressedNgramAnalyser"
    }
  }
},

最初我们假设如果我们在查询中包含该属性,则子字段将被匹配...

sd.Query(q => q.QueryString(qs => qs
    .Query(findText)
    .OnFields(f => f.Description, f => f.ItemCode)));

...但这并不在子字段中,而是在原始字段中。

如果我们想匹配子字段,我们似乎需要从类型化的 POCO 中脱钩,并显式引用和通配索引字段...

sd.Query(q => q.QueryString(qs => qs
    .Query(findText)
    .OnFields(new[] {"description", "itemCode.*"}))

我在这里错过了一个技巧吗?有没有更好的方法来处理 NEST 查询中的索引属性子字段?

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    在主字段上搜索不会自动扩展到子字段;您需要使用点符号来访问它们(itemCode.ngramitemCode.compressedNgram 等...),正如您已经发现的那样。

    NEST 提供了一种巧妙的方法来处理这个问题,同时仍然通过 Suffix() 扩展方法使用表达式:

    .OnFields(x => x.ItemCode.Suffix("*"))
    

    序列化后将转换为itemCode.*

    【讨论】:

    • 谢谢格雷格。我刚刚重新登录以回答我自己的问题,但你打败了我。这个 .Suffix() 扩展非常适合我们的需求,因为我们可以避免对属性名称进行硬编码,并且只需为类似处理的代码提供一些基于约定的字段名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多