代码之家  ›  专栏  ›  技术社区  ›  Mathias Lykkegaard Lorenzen

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

  •  1
  • Mathias Lykkegaard Lorenzen  · 技术社区  · 6 年前

    我有一个 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 建议:

    考虑到渗滤的设计,对渗滤查询和被渗滤的文档使用单独的索引通常是有意义的,而不是单一的索引…

    但是,我现在不能索引我的搜索代理文档,因为它们 Query 引用上的属性 项目 文件。这会导致以下错误:

    找不到名为[标题]的字段的字段映射

    我想这意味着我必须描述 项目 搜索代理 中的映射 搜索代理 索引。

    但是在ElasticSearch 6中, removed support for multiple mappings per index ,所以这是不可能的。

    我怎样才能解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Russ Cam    6 年前

    我想这意味着我必须描述 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>()
            )
        )
    );
    

    这将自动映射两者的属性 搜索代理 项目 在地图下面 搜索代理 并将导致以下请求

    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 documentation ;它当然可以改进,因为它省略了一些在从测试套件自动生成时不包含的信息,但希望它能给您一个想法。对于任何嵌套文档,您始终可以单击“文档”页面上的“编辑”按钮以获取指向原始源的链接,该源是从中生成的:

    Edit docs link

    Original source code

    这导致 https://github.com/elastic/elasticsearch-net/blob/6.x/src/Tests/Tests/QueryDsl/Specialized/Percolate/PercolateQueryUsageTests.cs 如果是Percolate 6.x文档。