当每个索引只能有一个Map时,是否将percolator存储在单独的索引中?

p1iqtdky  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(364)

我有一个 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
我想这意味着我必须描述 ItemSearchAgent 中的Map searchagent 索引。
但是在ElasticSearch6中,他们取消了对每个索引有多个Map的支持,所以这是不可能的。
我怎样才能避开这个问题?

ivqmmu1c

ivqmmu1c1#

我想这意味着我必须描述 Item 以及 SearchAgent 中的Map searchagent 索引。
这对于6.x是正确的。本质上,percolation需要知道将被过滤的文档的Map,因此包含查询的索引还需要有将被过滤的文档的字段。
使用nest6.x,可以使用

var client = new ElasticClient();

var createIndexResponse = client.CreateIndex("percolation", c => c
    .Mappings(m => m
        .Map<SearchAgent>(mm => mm
            .AutoMap<SearchAgent>()
            .AutoMap<Item>()
        )
    )
);

这将自动Map两者的属性 SearchAgent 以及 Item 在Map下 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上具有相同名称的属性将采用要Map的该名称的最后一个属性的Map,因此建议属性具有相同的Map,或者更好的是,查询文档包含不同名称的属性( Id 如果它们都被Map到相同的位置,就可以了,以避免在跟踪过程中出现潜在的混乱。
设置了渗透索引后,现在可以使用

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(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)
)
)
);

最后,看一下nest percolation查询dsl文档;它当然可以做一些改进,因为它省略了一些从测试套件自动生成时没有包含的信息,但希望它能给您一个想法。对于任何嵌套文档,您都可以单击“文档”页上的“编辑”按钮,以获取指向生成该文档的原始源的链接:
![](https://i.stack.imgur.com/RHXEN.png)
和
![](https://i.stack.imgur.com/DtOzL.png)
从而导致https://github.com/elastic/elasticsearch-net/blob/6.x/src/tests/tests/querydsl/specialized/percolate/percolatequeryusagetests.cs 对于percolate 6.x文档。

相关问题