如何最好地解决NEST中的索引属性子字段?

时间:2015-01-07 11:29:35

标签: elasticsearch nest

我正在尝试找出如何最好地让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查询中的索引属性子字段?

1 个答案:

答案 0 :(得分:1)

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

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

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

在序列化时会转换为itemCode.*