我想要做的是在一个索引字段下存储多种语言。我理解我需要结构here。
以下是具有多字段属性的示例类"名称":
public class Data
{
public int ID { get; set; }
public string Name { get; set; }
}
索引映射:
ElasticsearchConfiguration.Instance.Client.CreateIndex("data", i =>
i.Settings(s =>
s.NumberOfShards(2)
.NumberOfReplicas(0))
.Mappings(m =>
m.Map<Data>(map =>
map.AutoMap()
.Properties(ps => ps
.Text(s => s
.Name(n => n.Name)
.Fields(f => f
.Text(st => st
.Name("en")
.Analyzer("english"))
.Text(st => st
.Name("de")
.Analyzer("german"))))))));
映射&#34;对象类型 - &gt;索引名称&#34;是在创建ElasticClient时完成的。这就是我将数据发送到elasticsearch服务器的方式:
var dataPartitions = DBUtil.GetData().Partition(1000);
foreach (var partition in dataPartitions)
{
var result = ElasticsearchConfiguration.Instance.Client.Bulk(b => b.IndexMany(partition));
if (!result.IsValid)
{
Environment.Exit(1);
}
}
所以,我已根据需要配置索引,但我不知道如何在索引创建时为德语和英语子属性包含单独的值。我是否必须使用嵌套类&#34; Name&#34;具有每种语言的硬编码属性(在这种情况下&#34; en&#34;和&#34; de&#34;)?或者,可能会发送单独的语言属性请求?
答案 0 :(得分:1)
这里可能有所帮助。
class Program
{
static void Main(string[] args)
{
var url = new Uri("http://localhost.fiddler:9200");
ElasticClient db = new ElasticClient(url);
string[] lang = { "EN", "DE" };
db.Map<A>(des => des.AutoMap()
.Index("a")
.Properties(
p => p.Object<JObject>(
f => f.Name(n => n.Name).Properties(
props => props.String(
fen => fen.Name(lang[0])).String(fde => fde.Name(lang[1]))))));
foreach (var item in Enumerable.Range(0, 10).Select(i => new A
{
PropA = i,
Name = new JObject
{
[lang[0]] = "ABC" + i,
[lang[1]] = "GABC"
}
}))
{
var a = db.Index<A>(item, i => i.Index("a"));
}
var items = db.Search<A>(s=>s.Query(q=>q.Match(m=>m.Field("name.EN").Query("ABC1"))));
Console.ReadLine();
}
}
class A
{
[Number]
public int PropA { get; set; }
public JObject Name { get; set; }
}