Я предполагаю, что это означает, что я должен описать сопоставление Item
и SearchAgent
в индексе searchagent
.
Это верно для 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
, так и Item
при сопоставлении для SearchAgent
и приведет к следующему запросу
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"
}
}
}
Вы также можете установить соглашения для POCO на 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; это определенно можно улучшить, поскольку в нем отсутствует некоторая информация, которая не включается при автоматическом создании из набора тестов, но, надеюсь, это даст вам представление. С любой документацией NEST вы всегда можете нажать кнопку редактирования на странице документации, чтобы получить ссылку на исходный источник, из которого она создана:
а также
что приводит к https://github.com/elastic/elasticsearch-net/blob/6.x/src/Tests/Tests/QueryDsl/Specialized/Percolate/PercolateQueryUsageTests.cs в случае документации Percolate 6.x .
person
Russ Cam
schedule
29.12.2018