在项目之间,开始使用Elastic Search和NEST来准备一些自动完成功能 .

我在这里和各种文档中都遵循了示例......而且我似乎应该工作 . 必须与我正在做的事情有一些微妙的区别 .

这是代表我的文档的对象 .

[ElasticType(IdProperty="KeyInstn")]
public class Instn
{
    [ElasticProperty(Name = "keyinstn", Index = FieldIndexOption.Analyzed, Type = FieldType.Integer)]
    public int KeyInstn { get; set; }
    public string Type { get; set; }

    [ElasticProperty(Name = "name", Index = FieldIndexOption.Analyzed, Type = FieldType.String)]
    public string Name { get; set; }

    [ElasticProperty(Name = "ticker", Index = FieldIndexOption.Analyzed, Type = FieldType.String)]
    public string Ticker { get; set; }

    [ElasticProperty(Name = "street", Index = FieldIndexOption.Analyzed, Type = FieldType.String)]
    public string Street { get; set; }

    [ElasticProperty(Name = "city", Index = FieldIndexOption.Analyzed, Type = FieldType.String)]
    public string City { get; set; }

    [ElasticProperty(Name = "state", Index = FieldIndexOption.Analyzed, Type = FieldType.String)]
    public string State { get; set; }

    [ElasticProperty(Name = "zip", Index = FieldIndexOption.Analyzed, Type = FieldType.String)]
    public string Zip { get; set; }

    [ElasticProperty(Name = "country", Index = FieldIndexOption.Analyzed, Type = FieldType.String)]
    public string Country { get; set; }

    [ElasticProperty(Name = "suggest", Type = FieldType.Completion)]
    public CompletionField Suggest { get; set; }
}

这是我用来创建索引的代码:

var index = client.CreateIndex("snl", c => c
                .NumberOfReplicas(1)
                .NumberOfShards(5)
                .Settings(s => s
                    .Add("merge.policy.merge_factor", "10")
                    .Add("search.slowlog.threshold.fetch.warn", "1s")
                )
                .AddMapping<Instn>(m => m.MapFromAttributes()
                        .Properties(props => props
                            .Completion(s => s
                                .Name(p => p.Suggest)
                                .IndexAnalyzer("simple")
                                .SearchAnalyzer("simple")
                                .MaxInputLength(20)
                                .Payloads()
                                .PreservePositionIncrements()
                                .PreserveSeparators()
                            )
                        )
                ));

我在批量的1000个文档中使用IndexMany填充我的文档 .

然后我执行我的查询:

var suggestResponse = this._client.Suggest<Instn>(s => s
        .Index("snl")
        .Completion("suggest", c => c
            .Text(this.AutoCompleteText.Text)
            .OnField("suggest")));

我收到的错误是:

字段[建议]不是完成建议字段

使用SENSE,我拉出映射并注意到“suggest”没有类型 . 我遵循的例子表明类型应该是'完成:' .

Elasticsearch - Autocomplete with NEST

{
   "snl": {
      "mappings": {
         "instn": {
            "properties": {
               "city": {
                  "type": "string"
               },
               "country": {
                  "type": "string"
               },
               "keyinstn": {
                  "type": "long"
               },
               "name": {
                  "type": "string"
               },
               "state": {
                  "type": "string"
               },
               "suggest": {
                  "properties": {
                     "input": {
                        "type": "string"
                     },
                     "output": {
                        "type": "string"
                     },
                     "payload": {
                        "type": "long"
                     },
                     "weight": {
                        "type": "double"
                     }
                  }
               },
               "type": {
                  "type": "string"
               },
               "zip": {
                  "type": "string"
               }
            }
         }
      }
   }
}

我自己创建了CompletionObject,我也尝试了内在对象“SuggestField” .

如果有人能指出我正在做错的正确方向,我会很感激 . FWIW“正常”搜索工作正常并返回适当的结果 .

谢谢 .

UPDATE 1/26/2016

因此,设法获得一个看起来“更好”的索引...我能够绕过新的错误“在设置search_analyzer时必须设置完成时分析器”,在创建期间省略搜索分析器,现在我的索引看起来像这样:

{
   "snl": {
      "aliases": {},
      "mappings": {
         "instn": {
            "properties": {
               "city": {
                  "type": "string"
               },
               "country": {
                  "type": "string"
               },
               "keyinstn": {
                  "type": "long"
               },
               "name": {
                  "type": "string"
               },
               "state": {
                  "type": "string"
               },
               "suggest": {
                  "properties": {
                     "completion": {
                        "properties": {
                           "field": {
                              "type": "string"
                           }
                        }
                     },
                     "input": {
                        "type": "string"
                     },
                     "output": {
                        "type": "string"
                     },
                     "payload": {
                        "type": "long"
                     },
                     "text": {
                        "type": "string"
                     },
                     "weight": {
                        "type": "double"
                     }
                  }
               },
               "type": {
                  "type": "string"
               },
               "zip": {
                  "type": "string"
               }
            }
         }
      },
      "settings": {
         "index": {
            "creation_date": "1453835225862",
            "number_of_shards": "5",
            "number_of_replicas": "1",
            "uuid": "90QKK1OyRMKtwcyjAwPElA",
            "version": {
               "created": "2010199"
            }
         }
      },
      "warmers": {}
   }
}

但是,没有完成搜索会返回任何结果 . 是因为搜索分析器遗漏了吗?如果是这样,我如何绕过“设置search_analyzer时必须设置”完成时分析器字段“错误?