NEST /弹性搜索自动完成'字段[建议]不是完成建议字段'

时间:2016-01-25 22:09:51

标签: elasticsearch autocomplete nest

在两个项目之间,开始使用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()
                            )
                        )
                ));

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

然后我执行我的查询:

            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“正常”搜索工作正常并返回适当的结果。

感谢。

更新2016年1月26日

所以,设法得到一个看起来“更好”的索引......我能够解决新的错误“在设置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时必须设置”完成时分析器字段“错误?

0 个答案:

没有答案