SURZUS
SURZUS

Reputation: 11

Nest. How to Delete documents by terms

Can't delete documents from the elastic index.

Tried this code, but it didn't work

            string[] stringIds = categoryIds.Select(i => i.ToString()).ToArray();

            var client = new ElasticClient(_uri);

            await client.DeleteByQueryAsync<NomenclatureIndexModel>(d => d
                .Index(CategorySearchIndex)
                .Query(q => q
                    .Terms(ts => ts
                        .Field(f => f.Id)
                        .Terms(stringIds))));

What am I doing wrong?

Upvotes: 1

Views: 46

Answers (1)

Qiang Fu
Qiang Fu

Reputation: 8751

As far as I know. NEST package has been deprecated. Instead, you could use Elastic.Clients.Elasticsearch.
In this package you could use "FieldValue.String(x)" to convert string into TermsQueryField. Below is a working sample using Elastic.Clients.Elasticsearch:

var settings = new ElasticsearchClientSettings(new Uri("https://10.96.5.5:9200"))
        .CertificateFingerprint("xxxxxx")
        .Authentication(new BasicAuthentication("xxxx", "xxxx"));
var esClient = new ElasticsearchClient(settings);

var doc1 = new Company
{
    user = "tom"
};
var doc2 = new Company
{
    user = "jerry"
};

var response = await esClient.IndexAsync(doc1, index: "myindex");
var response2 = await esClient.IndexAsync(doc2, index: "myindex");

Console.WriteLine("update finish");

var termsToDelete = new List<string> { "tom", "jerry" };
var deleteResponse = await esClient.DeleteByQueryAsync<Company>(q => q
    .Indices("myindex")
            .Query(q => q
                .Terms(t => t
                    .Field("user")
                    .Term(new Elastic.Clients.Elasticsearch.QueryDsl.TermsQueryField(termsToDelete.Select(x => FieldValue.String(x)).ToArray()))
                ))
            );
var result = deleteResponse;

Console.WriteLine("delete finish");

Upvotes: 0

Related Questions