首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将DSL查询转换为NEST.net

将DSL查询转换为NEST.net
EN

Stack Overflow用户
提问于 2018-07-25 12:59:49
回答 1查看 137关注 0票数 0

我有下面的mapping,我正在尝试用NEST重写它,但似乎还没有完全正确。

代码语言:javascript
运行
复制
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字段。但不确定如何添加这些分析器

模型

代码语言:javascript
运行
复制
[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; }
    }

查询

代码语言:javascript
运行
复制
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))))));

更新

代码语言:javascript
运行
复制
GET company/_search
{
  "suggest": {
    "company-suggest": {
      "prefix": "trans",
      "completion": {
        "field": "companyName.completion",
        "fuzzy": {
          "fuzziness": 1
        }
      }
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-25 14:55:04

我决定只使用低层客户端,而不是试图将其重写到NEST中。因此,我创建了一个json文件,只需读取内容,然后使用以下方法

代码语言:javascript
运行
复制
var response = this.Client.LowLevel.IndicesCreate<CompanyResponse>("index-name", PostData.Bytes(bytes));
return response.ApiCall.Success;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51519548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档