将DSL查询转换为NEST.net

时间:2018-07-25 12:59:49

标签: elasticsearch nest

我有以下mapping,我正在尝试使用NEST重写它,但似乎还不太正确。

PUT company
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {},
        "analyzer": {
          "keyword_analyzer": {
            "filter": [
              "lowercase",
              "asciifolding",
              "trim"
            ],
            "char_filter": [],
            "type": "custom",
            "tokenizer": "keyword"
          },
          "edge_ngram_analyzer": {
            "filter": [
              "lowercase"
            ],
            "tokenizer": "edge_ngram_tokenizer"
          },
          "edge_ngram_search_analyzer": {
            "tokenizer": "lowercase"
          }
        },
        "tokenizer": {
          "edge_ngram_tokenizer": {
            "type": "edge_ngram",
            "min_gram": 2,
            "max_gram": 5,
            "token_chars": [
              "letter"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "companyId": {
          "type": "keyword"
        },
        "companyName": {
          "type": "text",
          "fields": {
            "keywordstring": {
              "type": "text",
              "analyzer": "keyword_analyzer"
            },
            "edgengram": {
              "type": "text",
              "analyzer": "edge_ngram_analyzer",
              "search_analyzer": "edge_ngram_search_analyzer"
            },
            "completion": {
              "type": "completion",
              "contexts": [
                {
                  "name": "companyGroupId",
                  "type": "category",
                  "path": "companyGroupId"
                }
              ]
            }
          },
          "analyzer": "standard"
        },
        "companyTradingName": {
          "type": "text",
          "index": false
        },
        "companyGroupId": {
          "type": "keyword"
        },
        "agencyId": {
          "type": "keyword"
        }
      }
    }
  }
}

这是我到的地方,我仍然需要将关键字字符串 edgengram 设置为 CompanyName 字段。但不确定如何添加这些分析器

模型

[ElasticsearchType(Name = "company")]
    public class CompanyDocument : IDocument
    {
        public long CompanyId { get; set; }

        public CompletionField CompanyName { get; set; } // <-- I think this needs to be set as an CompletionField 

        public string CompanyTradingName { get; set; }

        public long CompanyGroupId { get; set; }

        public long AgencyId { get; set; }
    }

查询

var response1 = this.Client.CreateIndex(
                "testing_testing",
                index => index
                    .Mappings(
                        ms => ms.Map<CompanyDocument>(
                            m => m.Properties(
                                p => p
                                    .Keyword(t => t.Name(n => n.AgencyId))
                                    .Keyword(t => t.Name(n => n.CompanyGroupId))
                                    .Keyword(t => t.Name(n => n.CompanyId))
                                    .Text(t => t.Name(n => n.CompanyName)
                                        .Fields(ff =>
                                            ff.Completion(descriptor => descriptor.Contexts(contextsDescriptor => contextsDescriptor.Category(contextDescriptor => contextDescriptor.Name("CompanyGroupId").Path("CompanyGroupId"))))))
                                    .Text(t => t.Name(n => n.CompanyTradingName).Index(false)))))
                    .Settings(
                        f => f.Analysis(analysis => analysis
                                .Analyzers(analyzers => analyzers
                                            .Custom("keyword_analyzer", _ => _.Filters("lowercase", "asciifolding", "trim").CharFilters().Tokenizer("keyword"))
                                            .Custom("edge_ngram_analyzer", _ => _.Filters("lowercase").Tokenizer("edge_ngram_tokenizer")).Custom("edge_ngram_search_analyzer", _ => _.Tokenizer("lowercase")))
                                .Tokenizers(
                                    descriptor => descriptor.EdgeNGram("edge_ngram_tokenizer", t => t.MinGram(2).MaxGram(5).TokenChars(TokenChar.Letter))))));

更新

GET company/_search
{
  "suggest": {
    "company-suggest": {
      "prefix": "trans",
      "completion": {
        "field": "companyName.completion",
        "fuzzy": {
          "fuzziness": 1
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我决定不使用它,而不是尝试将其重写为NEST。 所以我创建了一个json文件,只读取内容,然后仅使用以下内容

var response = this.Client.LowLevel.IndicesCreate<CompanyResponse>("index-name", PostData.Bytes(bytes));
return response.ApiCall.Success;

这似乎比尝试重新创建DSL查询要容易得多