2

私は国のリストに一致する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 を追加する方法が見つかりません。

4

2 に答える 2

2

MinimumShouldMatchでパタメータを適用できますTermsDescriptor。次に例を示します。

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

あなたの問題について

  1. 用語: 「オランダ」の場合、ID 3 のドキュメントが取得されます
  2. 用語: 「ポーランド」および「フランス」の場合、ID 1 および 2 のドキュメントが取得されます。
  3. 用語: 「ドイツ」の場合、ID 1 のドキュメントが取得されます
  4. 用語: 「ポーランド」、「フランス」、「ドイツ」の場合、ID 1 のドキュメントが取得されます。

これがあなたのポイントであることを願っています。

于 2015-03-31T10:04:18.770 に答える