Elasticsearch - Autocomplete with NEST

后端 未结 1 907
别那么骄傲
别那么骄傲 2021-01-06 08:45

I\'m trying to do autocomplete with the NEST client.

The code looks as follows:

Poco (condensed):

public class Course
{
    [ElasticProperty(         


        
1条回答
  •  别那么骄傲
    2021-01-06 08:52

    There are a few possible reasons why you might be receiving this error, but the most obvious one is that your mapping for type course in index myindex is out of date in relation to the query you're sending through.

    You can easily check the the mapping for the type with

    curl -XGET "http://localhost:9200/myindex/course/_mapping"
    

    It should look like

    {
       "myindex": {
          "mappings": {
             "course": {
                "properties": {
                   "id": {
                      "type": "integer"
                   },
                   "name": {
                      "type": "string"
                   },
                   "suggest": {
                      "type": "completion",
                      "analyzer": "simple",
                      "payloads": true,
                      "preserve_separators": true,
                      "preserve_position_increments": true,
                      "max_input_length": 20
                   }
                }
             }
          }
       }
    }
    

    If it doesn't you'll need to fix this, either by deleting the type in the index and recreating (or deleting the index altogether and recreating), or by creating a new index with the correct mapping and copying documents over from the old index if you want to *try* to keep any data you already have (this may or may not be possible here).

    The following will create the index as expected and perform the suggest query you're trying to run. Note that I have scoped the query to run only against the index myindex. The types

    public class Course
    {
        [ElasticProperty(Name = "id")]
        public int ID { get; set; }
    
        public string Name { get; set; }
    
        [ElasticProperty(Type = FieldType.Completion)]
        public CompletionField Suggest { get; set; }
    
        public Course(Course c)
        {
            if (c != null)
            {
                this.ID = c.ID;
                this.Name = c.Name;
                this.Suggest = new CompletionField
                {
                    Input = new List(this.Name.Split(' ')) { this.Name },
                    Output = this.Name,
                    Payload = new
                    {
                        id = this.Name
                    },
                    Weight = 1
                };
            }
        }
    }
    
    // I'm guessing CompletionField looks something like this?
    public class CompletionField
    {
        public List Input { get; set; }
        public string Output { get; set; }
        public object Payload { get; set; }
        public double Weight { get; set; }
    }
    

    and the creation of the index and query

    void Main()
    {
        var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
            .ExposeRawResponse(true)
            .SetConnectionStatusHandler(response =>
            {
                // log out the requests
                if (response.Request != null)
                {
                    Console.WriteLine("{0} {1} \n{2}\n", response.RequestMethod.ToUpperInvariant(), response.RequestUrl,
                        Encoding.UTF8.GetString(response.Request));
                }
                else
                {
                    Console.WriteLine("{0} {1}\n", response.RequestMethod.ToUpperInvariant(), response.RequestUrl);
                }
    
                if (response.ResponseRaw != null)
                {
                    Console.WriteLine("{0}\n{1}\n\n{2}\n", response.HttpStatusCode, Encoding.UTF8.GetString(response.ResponseRaw), new String('-', 30));
                }
                else
                {
                    Console.WriteLine("{0}\n\n{1}\n", response.HttpStatusCode, new String('-', 30));
                }
            });
    
        var client = new ElasticClient(settings);
    
        var indexResponse = client.CreateIndex("myindex", c => c
            .NumberOfReplicas(1)
            .NumberOfShards(5)
            .Settings(s => s
                .Add("merge.policy.merge_factor", "10")
                .Add("search.slowlog.threshold.fetch.warn", "1s")
            )
            .AddMapping(m => m.MapFromAttributes()
                    .Properties(props => props
                        .Completion(s => s
                            .Name(p => p.Suggest)
                            .IndexAnalyzer("simple")
                            .SearchAnalyzer("simple")
                            .MaxInputLength(20)
                            .Payloads()
                            .PreservePositionIncrements()
                            .PreserveSeparators()
                        )
                    )
            ));
    
        // give Elasticsearch some time to initialize the index
        Thread.Sleep(TimeSpan.FromSeconds(5));
    
        var suggestResponse = client.Suggest(s => s
            .Index("myindex")
            .Completion("course-suggest", c => c
                .Text("Nothilfe")
                .OnField("suggest")
                .Size(10)
            )
        );
    
        // do something with suggestResponse
    }
    

    This logs out the following to the console

    POST http://localhost:9200/myindex 
    {
      "settings": {
        "index": {
          "number_of_replicas": 1,
          "number_of_shards": 5,
          "merge.policy.merge_factor": "10",
          "search.slowlog.threshold.fetch.warn": "1s"
        }
      },
      "mappings": {
        "course": {
          "properties": {
            "id": {
              "type": "integer"
            },
            "name": {
              "type": "string"
            },
            "suggest": {
              "type": "completion",
              "search_analyzer": "simple",
              "index_analyzer": "simple",
              "payloads": true,
              "preserve_separators": true,
              "preserve_position_increments": true,
              "max_input_len": 20
            }
          }
        }
      }
    }
    
    200
    {"acknowledged":true}
    
    ------------------------------
    
    POST http://localhost:9200/myindex/_suggest 
    {
      "course-suggest": {
        "text": "Nothilfe",
        "completion": {
          "field": "suggest",
          "size": 10
        }
      }
    }
    
    200
    {"_shards":{"total":5,"successful":5,"failed":0}}
    
    ------------------------------
    

    0 讨论(0)
提交回复
热议问题