我有一个 SearchAgent
索引中的文档称为 searchagent
看起来是这样的:
[ElasticsearchType(IdProperty = "Id")]
public class SearchAgent
{
public string Id { get; set; }
[Keyword]
public string UserId { get; set; }
public QueryContainer Query { get; set; }
}
这是因为我想让我的用户创建“搜索代理”,在插入特定搜索的新文档时通知用户。
现在,我要查找相关搜索代理的文档位于 items
索引和是 Item
. 如下所示:
[ElasticsearchType(IdProperty = "Id")]
public class Item
{
public string Id { get; set; }
public string Title { get; set; }
}
这似乎也是文件所建议的:
考虑到渗滤的设计,对渗滤查询和正在渗滤的文档使用单独的索引通常是有意义的,而不是使用单个索引。。。
但是,我现在无法索引我的搜索代理文档,因为它们 Query
是指 Item
文件。这将导致以下错误:
找不到名为[标题]的字段的字段Map
我想这意味着我必须描述 Item
和 SearchAgent
中的Map searchagent
索引。
但是在ElasticSearch6中,他们取消了对每个索引有多个Map的支持,所以这是不可能的。
我怎样才能避开这个问题?
1条答案
按热度按时间ivqmmu1c1#
我想这意味着我必须描述
Item
以及SearchAgent
中的Mapsearchagent
索引。这对于6.x是正确的。本质上,percolation需要知道将被过滤的文档的Map,因此包含查询的索引还需要有将被过滤的文档的字段。
使用nest6.x,可以使用
这将自动Map两者的属性
SearchAgent
以及Item
在Map下SearchAgent
并将导致以下请求请注意,两个poco上具有相同名称的属性将采用要Map的该名称的最后一个属性的Map,因此建议属性具有相同的Map,或者更好的是,查询文档包含不同名称的属性(
Id
如果它们都被Map到相同的位置,就可以了,以避免在跟踪过程中出现潜在的混乱。设置了渗透索引后,现在可以使用
执行以下查询
您可能还需要为上的poco设置约定
ConnectionSettings
```var defaultIndex = "default-index";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex)
.DefaultMappingFor(d => d
.IndexName("percolation")
)
.DefaultMappingFor(d => d
.IndexName("items")
);
var client = new ElasticClient(settings);
var searchResponse = client.Search(s => s
.Query(q => q
.Percolate(p => p
.Type()
.Index()
.Id("item-id")
.Field(f => f.Query)
)
)
);