1.IndexExists檢測索引是否存在,更簡潔了,可以這樣
_ElasticClient.IndexExists(indices : indexName).Exists
2.索引數據的時候,如果數據是個字符串json,那么索引后查看數據是有問題的,索引的數據需要是個Model對象,此情況是個人遇到的,不確定是否有其他操作方法
3.如果索引數據是做了路由處理的話,那么使用Id搜索或者刪除也必須加上路由信息,不然會404找不到的,此情況只針對Id搜索或刪除
_ElasticClient.Get(new DocumentPath<T>(esId), s => s.Type(_EsType).Routing(routing)) _ElasticClient.DeleteAsync(new DeleteRequest(_ElasticClient.ConnectionSettings.DefaultIndex, _EsType, esId) { Routing = routing });
4.es.dll 6.x的使用雖然擺脫了Newtonsoft.Json的依賴,但也出現一些新的問題,序列化會和Newtonsoft不太一樣,導致老項目無法直接使用,比如c# Model中的屬性“Name”標記了jsonproperty["nm"],但6.x中索引的數據並沒有使用nm,依然是Name,這就是6.x中自帶序列化的問題。對於這個情況,6.x其實提供了一個接口IElasticsearchSerializer,只需要去實現並且使用即可,使用方法如下
var _ConnectionPool = new StaticConnectionPool(uris); var _ConnectionConfig = new ConnectionSettings(_ConnectionPool, sourceSerializer: (builtin, settingss) => new JsonNetSerializer()); var _ElasticClient = new ElasticClient(_ConnectionConfig.DefaultIndex("IndexName").DefaultFieldNameInferrer((name) => name));
JsonNetSerializer 是新建的實現類,繼承IElasticsearchSerializer,實現如下
public class JsonNetSerializer : IElasticsearchSerializer { private static JsonSerializer serializer = JsonSerializer.CreateDefault(); private static JsonSerializer indentedSerializer = JsonSerializer.CreateDefault(new JsonSerializerSettings { Formatting = Newtonsoft.Json.Formatting.Indented }); public object Deserialize(Type type, Stream stream) { var streamReader = new StreamReader(stream); var reader = new JsonTextReader(streamReader); return serializer.Deserialize(reader, type); } public T Deserialize<T>(Stream stream) { return (T)Deserialize(typeof(T), stream); } public Task<object> DeserializeAsync(Type type, Stream stream, CancellationToken cancellationToken = default(CancellationToken)) { var o = Deserialize(type, stream); return Task.FromResult(o); } public Task<T> DeserializeAsync<T>(Stream stream, CancellationToken cancellationToken = default(CancellationToken)) { var o = Deserialize<T>(stream); return Task.FromResult(o); } public void Serialize<T>(T data, Stream stream, SerializationFormatting formatting = SerializationFormatting.Indented) { var writer = new StreamWriter(stream); if (formatting == SerializationFormatting.Indented) indentedSerializer.Serialize(writer, data, typeof(T)); else serializer.Serialize(writer, data, typeof(T)); writer.Flush(); } public Task SerializeAsync<T>(T data, Stream stream, SerializationFormatting formatting = SerializationFormatting.Indented, CancellationToken cancellationToken = default(CancellationToken)) { Serialize(data, stream, formatting); return Task.CompletedTask; } }