当每个索引只能进行一个映射时,将过滤器存储在单独的索引中?
Storing percolator in separate index when only one mapping is possible per index?
我在名为 searchagent
的索引中有一个 SearchAgent
文档,它看起来像这样:
[ElasticsearchType(IdProperty = "Id")]
public class SearchAgent
{
public string Id { get; set; }
[Keyword]
public string UserId { get; set; }
public QueryContainer Query { get; set; }
}
这是因为我希望我的用户创建 "search agents" 以在插入用于特定搜索的新文档时通知用户。
现在,我要为其查找相关搜索代理的文档位于 items
索引中,并且是 Item
。看起来像下面这样:
[ElasticsearchType(IdProperty = "Id")]
public class Item
{
public string Id { get; set; }
public string Title { get; set; }
}
这似乎也是 the documentation 推荐的:
Given the design of percolation, it often makes sense to use separate indices for the percolate queries and documents being percolated, as opposed to a single index ...
但是,我现在无法为我的搜索代理文档编制索引,因为它们的 Query
引用了 Item
文档中的 属性。这会导致以下错误:
No field mapping can be found for the field with name [title]
我想这意味着我都必须在 searchagent
索引中描述 Item
和 SearchAgent
映射。
但在 Elasticsearch 6 中,它们 removed support for multiple mappings per index,所以这是不可能的。
我怎样才能解决这个问题?
I guess this means that I both have to describe the Item
and SearchAgent
mapping in the searchagent
index.
这对 6.x 是正确的。本质上,渗透需要知道将被渗透的文档的映射,因此包含查询的索引也需要具有将被渗透的文档的字段。
使用 NEST 6.x,可以使用
var client = new ElasticClient();
var createIndexResponse = client.CreateIndex("percolation", c => c
.Mappings(m => m
.Map<SearchAgent>(mm => mm
.AutoMap<SearchAgent>()
.AutoMap<Item>()
)
)
);
这将在 SearchAgent
的映射下自动映射 SearchAgent
和 Item
的属性,并将导致以下请求
PUT http://localhost:9200/percolation?pretty=true
{
"mappings": {
"searchagent": {
"properties": {
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"userId": {
"type": "keyword"
},
"query": {
"type": "percolator"
}
}
}
}
}
注意 在两个 POCO 上具有相同名称的 属性 将采用要映射的该名称的最后一个 属性 的映射,因此建议属性具有相同的映射或更好,查询文档包含不同命名的属性(Id
如果它们映射相同则很好),以避免潜在的混淆。
设置渗透索引后,现在可以通过
实现另一个索引中的目标文档
var searchResponse = client.Search<SearchAgent>(s => s
.Index("percolation") // index containing queries
.Query(q => q
.Percolate(p => p
.Type<Item>()
.Index("items") // index containing documents
.Id("item-id") // document id
.Field(f => f.Query) // field on SearchAgent containing query
)
)
);
执行以下查询
POST http://localhost:9200/percolation/searchagent/_search
{
"query": {
"percolate": {
"field": "query",
"id": "item-id",
"index": "items",
"type": "item"
}
}
}
您可能还想在 ConnectionSettings
上为 POCO 设置约定
var defaultIndex = "default-index";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex)
.DefaultMappingFor<SearchAgent>(d => d
.IndexName("percolation")
)
.DefaultMappingFor<Item>(d => d
.IndexName("items")
);
var client = new ElasticClient(settings);
那么搜索请求可以使用
var searchResponse = client.Search<SearchAgent>(s => s
.Query(q => q
.Percolate(p => p
.Type<Item>()
.Index<Item>()
.Id("item-id")
.Field(f => f.Query)
)
)
);
最后看一下NEST Percolation Query DSL documentation;它绝对可以改进,因为它省略了一些从测试套件自动生成时不包含的信息,但希望它能给你一个想法。对于任何 NEST 文档,您始终可以单击文档页面上的编辑按钮以获取 link 到生成它的原始来源:
和
在 Percolate 6.x 文档的情况下导致 https://github.com/elastic/elasticsearch-net/blob/6.x/src/Tests/Tests/QueryDsl/Specialized/Percolate/PercolateQueryUsageTests.cs。
我在名为 searchagent
的索引中有一个 SearchAgent
文档,它看起来像这样:
[ElasticsearchType(IdProperty = "Id")]
public class SearchAgent
{
public string Id { get; set; }
[Keyword]
public string UserId { get; set; }
public QueryContainer Query { get; set; }
}
这是因为我希望我的用户创建 "search agents" 以在插入用于特定搜索的新文档时通知用户。
现在,我要为其查找相关搜索代理的文档位于 items
索引中,并且是 Item
。看起来像下面这样:
[ElasticsearchType(IdProperty = "Id")]
public class Item
{
public string Id { get; set; }
public string Title { get; set; }
}
这似乎也是 the documentation 推荐的:
Given the design of percolation, it often makes sense to use separate indices for the percolate queries and documents being percolated, as opposed to a single index ...
但是,我现在无法为我的搜索代理文档编制索引,因为它们的 Query
引用了 Item
文档中的 属性。这会导致以下错误:
No field mapping can be found for the field with name [title]
我想这意味着我都必须在 searchagent
索引中描述 Item
和 SearchAgent
映射。
但在 Elasticsearch 6 中,它们 removed support for multiple mappings per index,所以这是不可能的。
我怎样才能解决这个问题?
I guess this means that I both have to describe the
Item
andSearchAgent
mapping in thesearchagent
index.
这对 6.x 是正确的。本质上,渗透需要知道将被渗透的文档的映射,因此包含查询的索引也需要具有将被渗透的文档的字段。
使用 NEST 6.x,可以使用
var client = new ElasticClient();
var createIndexResponse = client.CreateIndex("percolation", c => c
.Mappings(m => m
.Map<SearchAgent>(mm => mm
.AutoMap<SearchAgent>()
.AutoMap<Item>()
)
)
);
这将在 SearchAgent
的映射下自动映射 SearchAgent
和 Item
的属性,并将导致以下请求
PUT http://localhost:9200/percolation?pretty=true
{
"mappings": {
"searchagent": {
"properties": {
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"userId": {
"type": "keyword"
},
"query": {
"type": "percolator"
}
}
}
}
}
注意 在两个 POCO 上具有相同名称的 属性 将采用要映射的该名称的最后一个 属性 的映射,因此建议属性具有相同的映射或更好,查询文档包含不同命名的属性(Id
如果它们映射相同则很好),以避免潜在的混淆。
设置渗透索引后,现在可以通过
实现另一个索引中的目标文档var searchResponse = client.Search<SearchAgent>(s => s
.Index("percolation") // index containing queries
.Query(q => q
.Percolate(p => p
.Type<Item>()
.Index("items") // index containing documents
.Id("item-id") // document id
.Field(f => f.Query) // field on SearchAgent containing query
)
)
);
执行以下查询
POST http://localhost:9200/percolation/searchagent/_search
{
"query": {
"percolate": {
"field": "query",
"id": "item-id",
"index": "items",
"type": "item"
}
}
}
您可能还想在 ConnectionSettings
var defaultIndex = "default-index";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex)
.DefaultMappingFor<SearchAgent>(d => d
.IndexName("percolation")
)
.DefaultMappingFor<Item>(d => d
.IndexName("items")
);
var client = new ElasticClient(settings);
那么搜索请求可以使用
var searchResponse = client.Search<SearchAgent>(s => s
.Query(q => q
.Percolate(p => p
.Type<Item>()
.Index<Item>()
.Id("item-id")
.Field(f => f.Query)
)
)
);
最后看一下NEST Percolation Query DSL documentation;它绝对可以改进,因为它省略了一些从测试套件自动生成时不包含的信息,但希望它能给你一个想法。对于任何 NEST 文档,您始终可以单击文档页面上的编辑按钮以获取 link 到生成它的原始来源:
和
在 Percolate 6.x 文档的情况下导致 https://github.com/elastic/elasticsearch-net/blob/6.x/src/Tests/Tests/QueryDsl/Specialized/Percolate/PercolateQueryUsageTests.cs。