【发布时间】:2017-06-13 16:18:22
【问题描述】:
我有一个包含这些字段的 ElasticSearch 对象:
[Keyword]
public List<string> Tags { get; set; }
[Text]
public string Title { get; set; }
而且,在我用来获取所有文档中的顶部标签之前,使用以下代码:
var Match = Driver.Search<Metadata>(_ => _
.Query(Q => Q
.Term(P => P.Category, (int)Category)
&& Q.Term(P => P.Type, (int)Type))
.FielddataFields(F => F.Fields(F1 => F1.Tags, F2 => F2.Title))
.Aggregations(A => A.Terms("Tags", T => T.Field(F => F.Tags)
.Size(Limit))));
但在 Elastic 5.1 中,我收到错误 400 提示:
默认情况下,文本字段上的字段数据是禁用的。设置 fielddata=true on [标签] 为了通过反相将字段数据加载到内存中 倒排索引。
然后ES documentation about parameter mapping 会告诉您“这样做通常没有意义”和“有一个用于全文搜索的文本字段,以及一个为聚合启用 doc_values 的未分析关键字字段”。
但唯一的文档是针对 5.0 的,而针对 5.1 的同一页面似乎不存在。
现在,5.1 有一个关于 Term Aggregation 的页面,似乎涵盖了我需要的内容,但在 C#/Nest 中绝对找不到我可以使用的内容。
所以,我试图弄清楚如何从标签中获取所有文档中最热门的单词(其中每个标签都是自己的单词;例如 "New York"不是 "New" 和 "York") 和 C# 中的标题(每个单词都是它自己的东西)。
我需要编辑这篇文章,因为似乎存在更深层次的问题。我写了一些测试代码来说明这个问题:
让我们创建一个简单的对象:
public class MyObject
{
[Keyword]
public string Id { get; set; }
[Text]
public string Category { get; set; }
[Text(Fielddata = true)]
public string Keywords { get; set; }
}
创建索引:
var Uri = new Uri(Constants.ELASTIC_CONNECTIONSTRING);
var Settings = new ConnectionSettings(Uri)
.DefaultIndex("test")
.DefaultFieldNameInferrer(_ => _)
.InferMappingFor<MyObject>(_ => _.IdProperty(P => P.Id));
var D = new ElasticClient(Settings);
用随机的东西填充索引:
for (var i = 0; i < 10; i++)
{
var O = new MyObject
{
Id = i.ToString(),
Category = (i % 2) == 0 ? "a" : "b",
Keywords = (i % 3).ToString()
};
D.Index(O);
}
然后进行查询:
var m = D.Search<MyObject>(s => s
.Query(q => q.Term(P => P.Category, "a"))
.Source(f => f.Includes(si => si.Fields(ff => ff.Keywords)))
.Aggregations(a => a
.Terms("Keywords", t => t
.Field(f => f.Keywords)
.Size(Limit)
)
)
);
它的失败方式与以前相同,返回 400 并且:
默认情况下,文本字段上的字段数据是禁用的。设置 fielddata=true on [关键字] 为了通过反转反转来加载内存中的字段数据 索引。
但是 [Keywords] 上的 Fielddata 设置为 true,但它一直在抱怨它。
所以,让我们发疯,用这种方式修改类:
public class MyObject
{
[Text(Fielddata = true)]
public string Id { get; set; }
[Text(Fielddata = true)]
public string Category { get; set; }
[Text(Fielddata = true)]
public string Keywords { get; set; }
}
这样,一切都是文本,一切都有 Fielddata = true.. 好吧,同样的结果。
所以,要么我真的不理解一些简单的东西,要么它坏了或没有记录:)
【问题讨论】:
标签: c# elasticsearch nest