在弹性搜索中将 MinimumShouldMatch 与术语查询一起使用
Using MinimumShouldMatch with terms query in elasticsearch
我正在嵌套中为 elasticsearch 编写一个与国家列表匹配的查询 - 只要列表中的任何国家出现在 ESCountryDescription(国家列表)中,它就会立即匹配。我只想在 CountryList 中的所有国家都匹配 ESCountryDescription 时进行匹配。我相信我需要像本例中那样使用 MinimumShouldMatch http://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl-terms-query.html
a.Terms(t => t.ESCountryDescription, CountryList)
但是我找不到将 MinimumShouldMatch 添加到上面的查询中的方法。
您可以在TermsDescriptor
中应用MinimumShouldMatch
参数。这是一个例子:
var lookingFor = new List<string> { "netherlands", "poland" };
var searchResponse = client.Search<IndexElement>(s => s
.Query(q => q
.TermsDescriptor(t => t.OnField(f => f.Countries).MinimumShouldMatch("100%").Terms(lookingFor))));
或
var lookingFor = new List<string> { "netherlands", "poland" };
var searchResponse = client.Search<IndexElement>(s => s
.Query(q => q
.TermsDescriptor(t => t.OnField(f => f.Countries).MinimumShouldMatch(lookingFor.Count).Terms(lookingFor))));
这就是整个例子
class Program
{
public class IndexElement
{
public int Id { get; set; }
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
public List<string> Countries { get; set; }
}
static void Main(string[] args)
{
var indexName = "sampleindex";
var uri = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(uri).SetDefaultIndex(indexName).EnableTrace(true);
var client = new ElasticClient(settings);
client.DeleteIndex(indexName);
client.CreateIndex(
descriptor =>
descriptor.Index(indexName)
.AddMapping<IndexElement>(
m => m.MapFromAttributes()));
client.Index(new IndexElement {Id = 1, Countries = new List<string> {"poland", "germany", "france"}});
client.Index(new IndexElement {Id = 2, Countries = new List<string> {"poland", "france"}});
client.Index(new IndexElement {Id = 3, Countries = new List<string> {"netherlands"}});
client.Refresh();
var lookingFor = new List<string> { "germany" };
var searchResponse = client.Search<IndexElement>(s => s
.Query(q => q
.TermsDescriptor(t => t.OnField(f => f.Countries).MinimumShouldMatch("100%").Terms(lookingFor))));
}
}
关于您的问题
- 对于条款:"netherlands" 您将获得 ID 为 3
的文档
- 对于术语:"poland" 和 "france" 您将获得 ID 为 1 和 2
的文档
- 对于条款:"germany" 您将获得 ID 为 1
的文档
- 对于术语:"poland"、"france" 和 "germany" 您将获得文档
ID 为 1
我希望这是你的意思。
而不是
.Query(q => q
.Terms(t => t.ESCountryDescription, CountryList))
您可以使用下面的命令
.Query(q => q
.TermsDescriptor(td => td
.OnField(t => t.ESCountryDescription)
.MinimumShouldMatch(x)
.Terms(CountryList)))
有关 elasticsearch-net Github 存储库中的单元测试,请参阅 this。
我正在嵌套中为 elasticsearch 编写一个与国家列表匹配的查询 - 只要列表中的任何国家出现在 ESCountryDescription(国家列表)中,它就会立即匹配。我只想在 CountryList 中的所有国家都匹配 ESCountryDescription 时进行匹配。我相信我需要像本例中那样使用 MinimumShouldMatch http://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl-terms-query.html
a.Terms(t => t.ESCountryDescription, CountryList)
但是我找不到将 MinimumShouldMatch 添加到上面的查询中的方法。
您可以在TermsDescriptor
中应用MinimumShouldMatch
参数。这是一个例子:
var lookingFor = new List<string> { "netherlands", "poland" };
var searchResponse = client.Search<IndexElement>(s => s
.Query(q => q
.TermsDescriptor(t => t.OnField(f => f.Countries).MinimumShouldMatch("100%").Terms(lookingFor))));
或
var lookingFor = new List<string> { "netherlands", "poland" };
var searchResponse = client.Search<IndexElement>(s => s
.Query(q => q
.TermsDescriptor(t => t.OnField(f => f.Countries).MinimumShouldMatch(lookingFor.Count).Terms(lookingFor))));
这就是整个例子
class Program
{
public class IndexElement
{
public int Id { get; set; }
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
public List<string> Countries { get; set; }
}
static void Main(string[] args)
{
var indexName = "sampleindex";
var uri = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(uri).SetDefaultIndex(indexName).EnableTrace(true);
var client = new ElasticClient(settings);
client.DeleteIndex(indexName);
client.CreateIndex(
descriptor =>
descriptor.Index(indexName)
.AddMapping<IndexElement>(
m => m.MapFromAttributes()));
client.Index(new IndexElement {Id = 1, Countries = new List<string> {"poland", "germany", "france"}});
client.Index(new IndexElement {Id = 2, Countries = new List<string> {"poland", "france"}});
client.Index(new IndexElement {Id = 3, Countries = new List<string> {"netherlands"}});
client.Refresh();
var lookingFor = new List<string> { "germany" };
var searchResponse = client.Search<IndexElement>(s => s
.Query(q => q
.TermsDescriptor(t => t.OnField(f => f.Countries).MinimumShouldMatch("100%").Terms(lookingFor))));
}
}
关于您的问题
- 对于条款:"netherlands" 您将获得 ID 为 3 的文档
- 对于术语:"poland" 和 "france" 您将获得 ID 为 1 和 2 的文档
- 对于条款:"germany" 您将获得 ID 为 1 的文档
- 对于术语:"poland"、"france" 和 "germany" 您将获得文档 ID 为 1
我希望这是你的意思。
而不是
.Query(q => q
.Terms(t => t.ESCountryDescription, CountryList))
您可以使用下面的命令
.Query(q => q
.TermsDescriptor(td => td
.OnField(t => t.ESCountryDescription)
.MinimumShouldMatch(x)
.Terms(CountryList)))
有关 elasticsearch-net Github 存储库中的单元测试,请参阅 this。