首页 > 解决方案 > ElasticSearch 在 ASP.Net C# 中使用 Nest 7.2.1 添加条件子搜索

问题描述

如何将以下 SQL 查询转换为嵌套代码以搜索主要包含 2 列 1. CATEGORY 2. COMPANY_NAME 的 Elastic Search 索引?

SELECT * FROM dbo.Table 
WHERE 
COMPANY_NAME LIKE '%DATALIGENCE%' AND (CATEGORY LIKE 'A%' OR CATEGORY LIKE 'B%')

下面是我的 NEST 代码,它在没有类别条件的情况下工作正常:-

prefixText = {"prefixText":"DATALIGENCE","count":25}


                QueryContainer query = new MatchQuery
                {
                    //Field = Field<RawData>(p => p.company_name),
                    Analyzer = "standard",
                    Boost = 1.1,
                    Name = "named_query",
                    Field = "company_name",
                    //CutoffFrequency = 0.001,
                    Query = prefixText,
                    Fuzziness = Fuzziness.Auto,
                    //Fuzziness = Fuzziness.AutoLength(3, 6),
                    FuzzyTranspositions = true,
                    //MinimumShouldMatch = 1,
                    //FuzzyRewrite = MultiTermQueryRewrite.TopTermsBlendedFreqs(10),
                    Lenient = true,
                    //Operator = Operator.Or,
                    AutoGenerateSynonymsPhraseQuery = false
                    //MinimumShouldMatch = 50
                };

                var searchRequest = new SearchRequest("companylistindex")
                {
                    Query = query,
                    Size = 10,
                    MinScore = 1,
                    Sort = new List<ISort>
                        {
                        new FieldSort { Field = "_score", Order = Nest.SortOrder.Descending }
                        }
                    //Sort(sort => sort.OnField("_score").Descending())
                    //Sort = SortSpecialField.Score
                    //Sort = SortSpecialField.Score
                };
                var searchResults = client.Search<RawData>(searchRequest);
                //var jsonResult = JsonConvert.SerializeObject("{\"result\":true\"}");
                List<RawData> lstData = new List<RawData>();
                lstData = searchResults.Documents.ToList();

标签: c#asp.netelasticsearchnest

解决方案


好吧,我使用 linq-fluent(如果你没有数据对象,你将不得不交换)。我假设您的数据是正确的索引(没有关键字...)

QueryContainer filterContainer = null;
            filterContainer &= Query<yourtype>.QueryString(q
                    => q.Query("DATALIGENCE").Fields(f => f.Field(fi => fi.company_name)));

            filterContainer &= Query<yourtype>.Bool(b => b.Should(
                        bs => bs.Prefix(p => p.CATEGORY , "A", rewrite: (MultiTermQueryRewrite)null),
                        bs => bs.Prefix(p => p.CATEGORY , "B", rewrite: (MultiTermQueryRewrite)null)
                        )
                );

Client.Search<yourtype>(s => s
            .Query(q => q.Bool(b => b.Must(m => filterContainer 
                )
            )
            ));

推荐阅读