Create index with multi field mapping syntax with NEST 2.x

前端 未结 4 1286
野趣味
野趣味 2021-02-09 21:54

I just can\'t seem to get the syntax correct for multi field mapping in NEST 2.0--if that\'s the correct terminology. Every example I\'ve found for mapping seems to be <= the

4条回答
  •  眼角桃花
    2021-02-09 22:44

    In addition to Colin's and Selçuk's answers, you can also fully control the mapping through the fluent (and object initializer syntax) mapping API. Here's an example based on your requirements

    void Main()
    {
        var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
        var connectionSettings = new ConnectionSettings(pool);
    
        var client = new ElasticClient(connectionSettings);
    
        client.Map(m => m
            .Index("index-name")
            .AutoMap()
            .Properties(p => p
                .String(s => s
                    .Name(n => n.CompanyName)
                    .Fields(f => f
                        .String(ss => ss
                            .Name("raw")
                            .NotAnalyzed()
                        )
                    )
                )
                .Date(d => d
                    .Name(n => n.CreatedDate)
                    .Index(NonStringIndexOption.No)         
                )
                .String(s => s
                    .Name(n => n.CompanyDescription)
                    .Store(false)
                )
                .Nested(n => n
                    .Name(nn => nn.Locations.First())
                    .AutoMap()
                    .Properties(pp => pp
                        /* properties of MyChildType */
                    )
                )
            )
        );
    }
    
    public class MyType
    {
        // Index this & allow for retrieval.
        public int Id { get; set; }
    
        // Index this & allow for retrieval.
        // **Also**, in my searching & sorting, I need to sort on this **entire** field, not just individual tokens.
        public string CompanyName { get; set; }
    
        // Don't index this for searching, but do store for display.
        public DateTime CreatedDate { get; set; }
    
        // Index this for searching BUT NOT for retrieval/displaying.
        public string CompanyDescription { get; set; }
    
        // Nest this.
        public List Locations { get; set; }
    }
    
    public class MyChildType
    {
        // Index this & allow for retrieval.
        public string LocationName { get; set; }
    
        // etc. other properties.
    }
    

    This produces the mapping

    {
      "properties": {
        "id": {
          "type": "integer"
        },
        "companyName": {
          "type": "string",
          "fields": {
            "raw": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        },
        "createdDate": {
          "type": "date",
          "index": "no"
        },
        "companyDescription": {
          "type": "string",
          "store": false
        },
        "locations": {
          "type": "nested",
          "properties": {
            "locationName": {
              "type": "string"
            }
          }
        }
      }
    }
    

    Calling .AutoMap() causes NEST to infer the mapping based on the property types and any attributes applied to them. Then .Properties() overrides any of the inferred mappings. For example

    • CompanyName is mapped as a multi_field with the field companyName analyzed using the standard analyzer and companyName.raw not analyzed. You can reference the latter in your queries using .Field(f => f.CompanyName.Suffix("raw"))
    • Locations is mapped as a nested type (automapping by default would infer this as an object type mapping). You can then define any specific mappings for MyChildType using .Properties() inside of the Nested() call.

提交回复
热议问题