更改 b/w ElasticSearch 1.x 和 2.x
Changes b/w ElasticSearch 1.x and 2.x
是否存在关于如何将用 NEST 1.x 编写的代码更改为 2.x 的文档?
我看过这些网站,但它们不完整:
https://github.com/elastic/elasticsearch-net/blob/master/docs/2.0-breaking-changes/nest-breaking-changes.md
https://github.com/elastic/elasticsearch-net
https://www.elastic.co/blog/ga-release-of-nest-2-0-our-dot-net-client-for-elasticsearch
例如,我想知道如何替换以下内容:
1)
given ISearchResponse<T> searchResults = ...
怎么做:
searchResults.ConnectionStatus
searchResults.RequestInformation.Request
2)
client.Get<T>(s => s.Id(id));
3)
鉴于 QueryContainer query
new SearchDescriptor<T>()
.From(from)
.Size(pageSize)
.Query(query); //this dosen't work anymore
4)
MatchQuery 不接受 fuziness 作为 double 和类型参数作为字符串,因为它曾经
5) QueryDescriptor 似乎不见了 gasp
6) client.Update 失败了
var result = client.Update<CustomerProfile>(request => request
.Id(customer.CustomerId)
.Doc(customer)
.Refresh()
);
7) client.Get 的破解方式与 client.Update
类似
8) 在映射中,以下设置不再有效
CreateIndexDescriptor cid = ...
cid.NumberOfReplicas(numReplicas)
.NumberOfShards(numShards)
.Settings(s => s
.Add("merge.policy.merge_factor", "10")
.Add("search.slowlog.threshold.fetch.warn", "1s")
)
.Analysis(a => a.TokenFilters etc etc
编辑
9) 日期范围:
startDate 和 endDate 是 DateTime 类型
var qd = new QueryContainerDescriptor<EsActivity>();
QueryContainer qc = qd.Range(r =>
r.Field("esactivity.timestamp")
.GreaterThanOrEquals(DateMath.Anchored(startDate))
.LessThanOrEquals(DateMath.Anchored(endDate))
);
.GreaterThanOrEquals
需要一个 double
参数,但在文档页面上它需要 DateMath.Anchored(startDate)
10) 突出显示:
highlightFields: List<string>
Action<HighlightFieldDescriptor<T>> [] tmp = highlightFields.Select(field =>
new Action<HighlightFieldDescriptor<T>>(
highlighter => highlighter.Field(field)
)
).ToArray();
sd:SearchDescriptor<..>..
sd.Highlight(h => h
.PreTags(preTag)
.PostTags(postTag)
.OnFields(tmp)
);
我知道我可以用 .Fields(f=>f.OnAll())
替换 OnFields(tmp)
但我仍然想以某种方式自己指定字段。
既然我们已经在查询对象上应用了突出显示,那么为什么会有 HighlightQuery 选项可用。现在有 2 个查询调用。
我已经将上面的突出显示转换为
var tmp = highlightFields.Select(field =>
Tuple.Create<Field, IHighlightField>(
Field.Create(field),
new HighlightField()
)
).ToDictionary(x => x.Item1, x => x.Item2);
sd.Highlight(h => new Highlight
{
PreTags = new[] { preTag },
PostTags = new[] { postTag },
Fields = tmp
}
);
1) searchResults.ApiCall
替换 searchResults .ConnectionStatus
。
您可以使用 searchResults.ApiCall.RequestBodyInBytes
获取请求字节,您还需要在 ConnectionSettings
上设置 .DisableDirectStreaming()
以便在将请求写入请求流时捕获字节默认直接
2) 使用client.Get<T>(id)
- 第一个参数是DocumentPath<T>
type.
3) 要将 QueryContainer
传递给 Fluent API 描述符,只需 return 它来自 Func<QueryContainerDescriptor<T>, QueryContainer>
new SearchDescriptor<T>()
.From(from)
.Size(pageSize)
.Query(_ => query);
4) match
查询模糊性作为 double
mapped to a formula to calculate edit distance in Elasticsearch 1.x. 因为这在 Elasticsearch 2.x 中被删除了,所以它也从 NEST 中消失了。您可以使用
设置模糊编辑距离
client.Search<Document>(s => s
.Query(q => q
.Match(m => m
.Query("this is my query")
.Fuzziness(Fuzziness.EditDistance(3))
)
)
);
不确定 type
指的是什么,但我认为您指的是文档类型?如果是这种情况,文档类型采用 Types
类型,string
隐式转换为
client.Search<Document>(s => s
.Type("other-type")
.MatchAll()
);
5) QueryDescriptor<T>
已重命名为 QueryContainerDescriptor<T>
以更好地反映它是用于构建 QueryContainer
的描述符这一事实
6) 更新 API 有效
// specifying id
client.Update<Document>("document-id", u => u
.Doc(document)
.Refresh()
);
由于第一个参数是 DocumentPath<T>
,文档实例(如果有的话)可以作为第一个参数传递
client.Update<Document>(document, u => u
.Doc(document)
.Refresh()
);
其中索引、类型和 id 将从文档实例中推断出来
7) 见上文
8) 创建索引设置已修改,以反映设置在 REST API json 调用中出现的级别
client.CreateIndex("index-name", c => c
.Settings(s => s
.NumberOfShards(2)
.NumberOfReplicas(2)
.SlowLog(sl => sl
.Search(sls => sls
.Fetch(slsf => slsf
.ThresholdWarn("1s")
)
)
)
.Analysis(a => a) // etc...
)
);
如果您愿意,您也可以使用字符串进行设置,尽管流畅的 API 将确保发送正确的设置值,例如"search.slowlog.threshold.fetch.warn"
现在是 "index.search.slowlog.threshold.fetch.warn"
client.CreateIndex("index-name", c => c
.Settings(s => s
.NumberOfShards(2)
.NumberOfReplicas(2)
.Setting("index.search.slowlog.threshold.fetch.warn", "1s")
.Analysis(a => a) // etc...
)
);
是否存在关于如何将用 NEST 1.x 编写的代码更改为 2.x 的文档?
我看过这些网站,但它们不完整:
https://github.com/elastic/elasticsearch-net/blob/master/docs/2.0-breaking-changes/nest-breaking-changes.md
https://github.com/elastic/elasticsearch-net
https://www.elastic.co/blog/ga-release-of-nest-2-0-our-dot-net-client-for-elasticsearch
例如,我想知道如何替换以下内容:
1)
given ISearchResponse<T> searchResults = ...
怎么做:
searchResults.ConnectionStatus
searchResults.RequestInformation.Request
2)
client.Get<T>(s => s.Id(id));
3)
鉴于 QueryContainer query
new SearchDescriptor<T>()
.From(from)
.Size(pageSize)
.Query(query); //this dosen't work anymore
4) MatchQuery 不接受 fuziness 作为 double 和类型参数作为字符串,因为它曾经
5) QueryDescriptor 似乎不见了 gasp
6) client.Update 失败了
var result = client.Update<CustomerProfile>(request => request
.Id(customer.CustomerId)
.Doc(customer)
.Refresh()
);
7) client.Get 的破解方式与 client.Update
类似8) 在映射中,以下设置不再有效
CreateIndexDescriptor cid = ...
cid.NumberOfReplicas(numReplicas)
.NumberOfShards(numShards)
.Settings(s => s
.Add("merge.policy.merge_factor", "10")
.Add("search.slowlog.threshold.fetch.warn", "1s")
)
.Analysis(a => a.TokenFilters etc etc
编辑
9) 日期范围:
startDate 和 endDate 是 DateTime 类型
var qd = new QueryContainerDescriptor<EsActivity>();
QueryContainer qc = qd.Range(r =>
r.Field("esactivity.timestamp")
.GreaterThanOrEquals(DateMath.Anchored(startDate))
.LessThanOrEquals(DateMath.Anchored(endDate))
);
.GreaterThanOrEquals
需要一个 double
参数,但在文档页面上它需要 DateMath.Anchored(startDate)
10) 突出显示:
highlightFields: List<string>
Action<HighlightFieldDescriptor<T>> [] tmp = highlightFields.Select(field =>
new Action<HighlightFieldDescriptor<T>>(
highlighter => highlighter.Field(field)
)
).ToArray();
sd:SearchDescriptor<..>..
sd.Highlight(h => h
.PreTags(preTag)
.PostTags(postTag)
.OnFields(tmp)
);
我知道我可以用 .Fields(f=>f.OnAll())
替换 OnFields(tmp)
但我仍然想以某种方式自己指定字段。
既然我们已经在查询对象上应用了突出显示,那么为什么会有 HighlightQuery 选项可用。现在有 2 个查询调用。
我已经将上面的突出显示转换为
var tmp = highlightFields.Select(field =>
Tuple.Create<Field, IHighlightField>(
Field.Create(field),
new HighlightField()
)
).ToDictionary(x => x.Item1, x => x.Item2);
sd.Highlight(h => new Highlight
{
PreTags = new[] { preTag },
PostTags = new[] { postTag },
Fields = tmp
}
);
1) searchResults.ApiCall
替换 searchResults .ConnectionStatus
。
您可以使用 searchResults.ApiCall.RequestBodyInBytes
获取请求字节,您还需要在 ConnectionSettings
上设置 .DisableDirectStreaming()
以便在将请求写入请求流时捕获字节默认直接
2) 使用client.Get<T>(id)
- 第一个参数是DocumentPath<T>
type.
3) 要将 QueryContainer
传递给 Fluent API 描述符,只需 return 它来自 Func<QueryContainerDescriptor<T>, QueryContainer>
new SearchDescriptor<T>()
.From(from)
.Size(pageSize)
.Query(_ => query);
4) match
查询模糊性作为 double
mapped to a formula to calculate edit distance in Elasticsearch 1.x. 因为这在 Elasticsearch 2.x 中被删除了,所以它也从 NEST 中消失了。您可以使用
client.Search<Document>(s => s
.Query(q => q
.Match(m => m
.Query("this is my query")
.Fuzziness(Fuzziness.EditDistance(3))
)
)
);
不确定 type
指的是什么,但我认为您指的是文档类型?如果是这种情况,文档类型采用 Types
类型,string
隐式转换为
client.Search<Document>(s => s
.Type("other-type")
.MatchAll()
);
5) QueryDescriptor<T>
已重命名为 QueryContainerDescriptor<T>
以更好地反映它是用于构建 QueryContainer
6) 更新 API 有效
// specifying id
client.Update<Document>("document-id", u => u
.Doc(document)
.Refresh()
);
由于第一个参数是 DocumentPath<T>
,文档实例(如果有的话)可以作为第一个参数传递
client.Update<Document>(document, u => u
.Doc(document)
.Refresh()
);
其中索引、类型和 id 将从文档实例中推断出来
7) 见上文
8) 创建索引设置已修改,以反映设置在 REST API json 调用中出现的级别
client.CreateIndex("index-name", c => c
.Settings(s => s
.NumberOfShards(2)
.NumberOfReplicas(2)
.SlowLog(sl => sl
.Search(sls => sls
.Fetch(slsf => slsf
.ThresholdWarn("1s")
)
)
)
.Analysis(a => a) // etc...
)
);
如果您愿意,您也可以使用字符串进行设置,尽管流畅的 API 将确保发送正确的设置值,例如"search.slowlog.threshold.fetch.warn"
现在是 "index.search.slowlog.threshold.fetch.warn"
client.CreateIndex("index-name", c => c
.Settings(s => s
.NumberOfShards(2)
.NumberOfReplicas(2)
.Setting("index.search.slowlog.threshold.fetch.warn", "1s")
.Analysis(a => a) // etc...
)
);