gpt4 book ai didi

c# - 如果每个索引只能进行一次映射,则将渗滤器存储在单独的索引中吗?

转载 作者:行者123 更新时间:2023-12-02 23:16:37 24 4
gpt4 key购买 nike

我在名为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; }
}

这似乎也是 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]



我想这意味着我俩都必须在 Item索引中描述 SearchAgentsearchagent映射。

但是在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的映射下自动映射 ItemSearchAgent的属性,并导致以下请求
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文档,您始终可以单击docs页面上的edit按钮,以获取指向其原始来源的链接:

Edit docs link



Original source code

对于Percolate 6.x文档,这导致 https://github.com/elastic/elasticsearch-net/blob/6.x/src/Tests/Tests/QueryDsl/Specialized/Percolate/PercolateQueryUsageTests.cs

关于c# - 如果每个索引只能进行一次映射,则将渗滤器存储在单独的索引中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53855071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com