繁体   English   中英

如何使用IElasticClient通过字符串数组和字符串参数搜索弹性数据?

[英]How to search elastic data by array of string and string parameter by using IElasticClient?

由于我不熟悉ElasticSearch概念,因此我使用一些代码作为指导,通过注入的IElasticClient构建我的通用弹性搜索NEST查询。 也就是说,正在跟随

public async Task<IEnumerable<T>> GetEsDataWithSearchParameterAsync<T>(string indexName, string searchParameter) where T : class
        {
            var searchResponse = await _elasticClient.SearchAsync<T>(s => s
                                 .Index(indexName)
                                 .Query(q => q.MatchAll())
                                 .Query(q => q.QueryString(qs => qs.Query(searchParameter + "*")))
                                  ).ConfigureAwait(false);
            var documents = searchResponse.Documents;
            return documents;
        }

我已阅读链接,但很难掌握。 我正在寻找类似于 Udemy 提供的综合学习视频课程,但到目前为止我还没有成功找到任何课程。

所以我需要编写一个通用方法来通过字符串数组和字符串值获取属性列表,比如

 public async Task<IEnumerable<T>> GetEsDataByArrayOfValuesWithFieldNameAndParameterAsync<T>(string indexName,string searchParameter,string field, string[] values) where T : class
    {
        var searchResponse = await _elasticClient.SearchAsync<T>(s => s
                             .Index(indexName)
                             .Query(q=>q.Term("market", searchParameter))
                             .Query(q => q.Bool(b => b.Should(s => TermAny(s, field, values))))
        );

        var documents = searchResponse.Documents;
        return documents;
    }

    private static QueryContainer TermAny<T>(QueryContainerDescriptor<T> descriptor, Field field, object[] values) where T : class
    {
        QueryContainer q = new QueryContainer();
        foreach (var value in values)
        {
            q |= descriptor.Term(t => t.Field(field).Value(value));
        }
        return q;
    }

正如这个链接所提到的,我更新了我的代码但没有得到任何数据,但是通过 DSL 查询它得到了 2 条记录

query: {query_string: {query: "(clusterId: "/SE_003/","/SE_004/") AND (market:SE)"}}
query_string: {query: "(clusterId: "/SE_003/","/SE_004/") AND (market:SE)"}
query: "(clusterId: \"/SE_003/\",\"/SE_004/\") AND (market:SE)"

并尝试过

var searchResponse = await _elasticClient.SearchAsync<T>(s => s
             .Index(indexName)
             //.Query(q=>q.Bool(b=>b.Should(s=>
             //    s.Match(qs => qs.Field("market").Query(searchParameter)),
             //    s.Query(sq => sq.Terms(c=>c.Field(field).Terms<string>(values)))
             //    )))
             .Query(q => q.Match(qs => qs.Field("market").Query(searchParameter)))
             .Query(q => q.Terms(c => c.Field(field).Terms<string>(values)))
             );

这也获得了 null 记录。

 var searchResponse = await _elasticClient.SearchAsync<T>(s => s
                             .Index(indexName)
                             .From(0)
                             .Size(10000)
                             .Query(q =>
                             q.QueryString(qs =>
                             qs.Query($"({firstField}:{firstFieldValue}) {operatorType} ({secondField}:{secondFieldValue})")))
                             .Sort(s => s.Ascending(SortLinks))
                             ).ConfigureAwait(false);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM