Elasticsearch.net索引设置+分析器

时间:2016-05-02 09:54:26

标签: elasticsearch nest elasticsearch-net

我可以使用带有C#(Nest)的elasticsearch 2.3.0版本

我想使用索引分析,
 但索引设置不会改变,我不知道为什么。 这是我的代码:

        private void button1_Click_1(object sender, EventArgs e)
          {
          var conn = new Uri("http://localhost:9200");
          var config = new ConnectionSettings(conn);
          var client = new ElasticClient(config);
          string server = cmb_Serv.Text.Trim();
      if (server.Length > 0)
    {
          string ser = server;
          string uid = util.getConfigValue("SetUid");
          string pwd = util.getConfigValue("SetPwd");
          string dbn = cmb_Db.Text;
          string tbl = cmb_Tbl.Text;
          setWorkDbConnection(ser, uid, pwd, dbn);

          string query = util.getConfigValue("SelectMC");
          query = query.Replace("###tbl###",tbl);

          using (SqlCommand cmd1 = new SqlCommand())
          {
              using (SqlConnection con1 = new SqlConnection())
              {
                  con1.ConnectionString = util.WorkConnectionString;
                  con1.Open();
                  cmd1.CommandTimeout = 0; cmd1.Connection = con1;
                  cmd1.CommandText = query;

                  int id_num =0;

                  SqlDataReader reader = cmd1.ExecuteReader();
                  while (reader.Read())
                  { id_num++;

                  Console.Write("\r" + id_num);

                      var mc = new mc
                      {
                          Id = id_num,
                          code = reader[0].ToString(),
                          mainclass = reader[1].ToString().Trim()
                      };
                       client.Index(mc, idx => idx.Index("mctest_ilhee"));
                     client.Alias(x => x.Add(a =>         a.Alias("mcAlias").Index("mctest_ilhee")));
                       client.Map<mc>(d => d
                           .Properties(props => props
                            .String(s => s
                           .Name(p => p.mainclass)
                           .Name(p2 => p2.code).Index(FieldIndexOption.Analyzed).Analyzer("whitespace"))));



                  } reader.Dispose();
                  reader.Close();

              }
              IndexSettings Is = new IndexSettings();
              Is.Analysis.Analyzers.Add("snowball", new SnowballAnalyzer());
              Is.Analysis.Analyzers.Add("whitespace", new WhitespaceAnalyzer());
          }
      }
    }

1 个答案:

答案 0 :(得分:1)

首先,你的代码很奇怪。 你为什么要在映射中进行映射?仅映射一次。 它无法帮助你,因为你甚至没有提供错误。我建议添加简单的调试方法。

protected void ValidateResponse(IResponse response)
{
    if (!response.IsValid ||
    (response is IIndicesOperationResponse && !((IIndicesOperationResponse) response).Acknowledged))
    {
        var error =  string.Format("Request to ES failed with error: {0} ", response.ServerError != null ? response.ServerError.Error : "Unknown");
        var esRequest = string.Format("URL: {0}\n Method: {1}\n Request: {2}\n",
                    response.ConnectionStatus.RequestUrl,
                    response.ConnectionStatus.RequestMethod,
                    response.ConnectionStatus.Request != null
                        ? Encoding.UTF8.GetString(response.ConnectionStatus.Request)
                        : string.Empty);
    }
}

所有请求(例如 client.Alias client.Map )都会返回状态。所以你可以做到

var result = client.Map<mc>(.....YOUR_CODE_HERE....)
ValidateResponse(result);

然后你会看到两件事,ES返回的命令错误+ NEST发送给ES的请求