如何使用ElasticSearch NEST获取其列表包含一些参数的对象?

时间:2018-02-28 13:27:38

标签: c# elasticsearch nest

我有一个名为Product的课程,可以在1个或更多国家/地区使用(但很少全部都可以使用)。

我希望在我的查询中包含一些内容,使我的搜索/查询仅返回在该国家/地区销售的产品。

我最好的选择是在我的产品对象中有一个列表,其中包含CountryIds(产品销售的国家/地区)。但我在NEST中找不到查询参数来查找其所有产品" CountryIds" list包含给定的ID(我在运行时知道)。 基本上我想通过弹性搜索来解释如何编写这个方法的内容。

Product[] GetProductsByCountryId(int countryId);

Product类看起来像这样:

class Product {
   string productName;
   int[] countryIds;
}

2 个答案:

答案 0 :(得分:1)

term query将返回包含countryIDs内国家/地区ID的文档。

如果您有多个国家/地区ID,terms query将返回countryIDs字段中至少包含一个国家/地区ID的文档。

答案 1 :(得分:0)

Russ Cam给了我正确的想法,但我只想发布我的完整代码结果:

_client.Search<Product>(s =>
            s.Query(q => q.FunctionScore(fs => fs.Functions(ff =>
                ff.ScriptScore(
                    ss =>
                        ss.Script(script => script.Params(p => PopulateParameterDictionary(p))
                            .Inline(GenerateSearchAlgorithm())
                        )))) 
                    &&+  q.Terms(c => c.Name("country_ids_query")
                         .Field(f => f.CountryIdsWhereAvailable)
                         .Terms(country.Id))));

此结果还包括使用内联脚本的评分。但这里答案的重要部分是第二个查询&#34; country_ids_query&#34;。

这会过滤掉CountryIdsWhereAvailable整数数组不包含&#34; country.Id&#34;的产品,并且仍会根据我的脚本对它们进行评分。