ElasticSearch 2.X升級到6.X遇到的幾個問題


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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM