Search code examples
c#elasticsearchnestelasticsearch-percolate

How to use NEST v6 to percolate


How do I use the percolator capabilities of ES to match an incoming document with my query? my query is "biggest winner"

I'm using ES v6 and the same version of NEST lib.

this is my class

public class PercolatedQuery
{
    public string Subject { get; set; }

    public string Body { get; set; }

    public string URL { get; set; }

    public DateTime? Date { get; set; }

    public QueryContainer Query { get; set; }
}

this is my setting

Uri node = new Uri("http://localhost:9200/");
    this.Settings = new ConnectionSettings(node)
        .DisableDirectStreaming()
        .DefaultIndex("mytestIndex");
    this.Client = new ElasticClient(this.Settings);
    if (!this.Client.IndexExists("mytestIndex").Exists)
    {
        this.Client.CreateIndex("mytestIndex", c => c
            .Settings(s => s
                .NumberOfShards(1)
                .NumberOfReplicas(0)
            )
            .Mappings(m => m
                .Map<PercolatedQuery>(mm => mm
                    .AutoMap()
                    .Properties(p => p
                        // map the query field as a percolator type
                        .Percolator(pp => pp
                            .Name(n => n.Query)
                        )
                    )
                )
            )
            );
        this.Client.Alias(a => a
            .Add(add => add
                .Index("mytestIndex")
                .Alias("testAlias")
            ));
    }

Solution

  • I had to save the query, then I could search for a document

            PercolatedQuery documentQuery = new PercolatedQuery
            {
                Id = "PercolatedQuery",
                Query = new MatchQuery
                {
                    Field = Infer.Field<PercolatedQuery>(entry => entry.Body),
                    Query = "healthcare biggest"
                }
            };
            Client.Index(documentQuery,
               d => d.Index("mytestIndex").Refresh(Refresh.WaitFor));
    
            PercolatedQuery document1 = new PercolatedQuery { Body = "healthcare biggest winner" };
            Client.Search<PercolatedQuery>(s => s
                .Query(q => q
                    .Percolate(p => p
                        .Field(f => f.Query)
                        .Document(document1)
                    )
                )
                );