CompletionSuggester在添加自定义分析器时停止工作。 NEST C#

时间:2016-11-16 12:19:24

标签: c# elasticsearch nest

我们在AWS上使用ElasticSearch并使用NEST创建索引。

访问我们的服务器URL时_mapping我可以看到这样的completionsuggester:

"matchSuggest": {
"type": "completion",
"analyzer": "simple",
"payloads": true,
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
}

MatchIndex声明如下:

 public class MatchIndex
 {
        ...
        public CompletionField<object> MatchSuggest { get; set; }
 }

但是我们尝试将自定义分析器添加到另一个类的索引中,它会破坏所有完成建议器。

client.CreateIndex("search", i => i
    .Settings(s => s
        .NumberOfShards(5)
        .NumberOfReplicas(1)
        .Analysis(analysis => analysis
        .TokenFilters(tokenfilters => tokenfilters
            .AsciiFolding("folding-preserve", ft => ft
                .PreserveOriginal()
            )
        )

.Mappings(m => m
    .Map<PlayerIndex>(map => map
        .AutoMap().Properties(ps => ps
         .String( s => s
            .Name(n => n.Name)
            .Fields(f => f
                .String(ss => ss
                    .Name("folding")
                    .Analyzer("folding-analyzer")
                    )
             )
             .NotAnalyzed()
         )
        .Completion(c => c
            .Name(p => p.SquadMemberSuggest)
            .Payloads()
        )

        )       

    )

当我现在访问_mapping端点时,所有建议器都不再列为完成建议器。没有错误。每次我们尝试添加自定义分析器时,这似乎都会发生。这有什么理由吗? Elasticsearch是否有任何我们可以查看的错误日志,以找出发生这种情况的原因?

"matchSuggest": {
    "properties": {
      "input": {
        "type": "string"
      },
      "output": {
        "type": "string"
      },
      "payload": {
        "properties": {
          "awayTeamId": {
            "type": "string"
          },
          "homeTeamId": {
            "type": "string"
          },
          "id": {
            "type": "string"
          }
        }
      },
      "weight": {
        "type": "long"
      }
    }
  },
  "name": {
    "type": "string"
  },
  "parentLeagueId": {
    "type": "string"
  },
  "statusId": {
    "type": "long"
  }
}

1 个答案:

答案 0 :(得分:1)

完成类型字段使用FST(有限状态传感器)数据结构来提供自动完成。每个索引每个字段创建一个单独的FST ,因此在相同的索引中将两个类型设置为completion字段的相同字段将意味着两个字段的字段映射设置将需要是一样的。事实上,同一索引中不同类型的同名字段也有此限制。

您可以考虑通过在完成字段的类型上使用不同的字段名称或每个索引只有一种类型来解决此问题。