如何使用elasticsearch索引多字段元素
How to index multi-field element with elasticsearch
我想做的是在一个索引字段下存储多种语言。我知道我需要结构 here.
这里是示例 class 多文件 属性 "Name":
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"))))))));
映射 "object type -> index name" 在创建 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);
}
}
所以,我已经根据需要配置了索引,但我不知道如何在创建索引时为德语和英语子属性包含单独的值。我是否必须嵌套 class 而不是 "Name",并为每种语言(在本例中为 "en" 和 "de")设置硬编码属性?或者,也许发送单独的语言属性请求?
这里有些东西可能会有所帮助。
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; }
}
我想做的是在一个索引字段下存储多种语言。我知道我需要结构 here.
这里是示例 class 多文件 属性 "Name":
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"))))))));
映射 "object type -> index name" 在创建 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);
}
}
所以,我已经根据需要配置了索引,但我不知道如何在创建索引时为德语和英语子属性包含单独的值。我是否必须嵌套 class 而不是 "Name",并为每种语言(在本例中为 "en" 和 "de")设置硬编码属性?或者,也许发送单独的语言属性请求?
这里有些东西可能会有所帮助。
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; }
}