elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# 在nest elasticsearch中使用原始字符串创建查询

C# 在nest elasticsearch中使用原始字符串创建查询,c#,elasticsearch,nest,C#,elasticsearch,Nest,我需要动态创建查询。我在一个哈希表中列出了一系列术语,它们的权重随着术语数量的变化而变化。我想在大量文档的内容中搜索这些术语,并根据其权重增加每个单词。类似于下面的代码: var searchResults = client.Search<Document>(s => s.Index(defaultIndex) .Query(q => q.Match(m => m.OnField(p => p.File).Query(term1).Boost(term1.w

我需要动态创建查询。我在一个哈希表中列出了一系列术语,它们的权重随着术语数量的变化而变化。我想在大量文档的内容中搜索这些术语,并根据其权重增加每个单词。类似于下面的代码:

var searchResults = client.Search<Document>(s => s.Index(defaultIndex)
 .Query(q => q.Match(m => m.OnField(p => p.File).Query(term1).Boost(term1.weight).Query(term2).Query(term2.weight)...Query(term N ).Boost(termN.weight))))
既然我不知道每次有多少个术语,我该如何处理这样的问题?除了“原始字符串”,还有人知道其他解决方案吗? 我正在使用C#Nest Elasticsearch

以下是针对这种情况的JSON Elasticsearch查询示例:

GET  testindex2/document/_search
{
  "query": {
   "bool": {
    "should": [
    {
      "match": {
        "file": {
          "query": "kit",
          "boost": 3
        }
      }
    },
    {
      "match": {
        "file": {
          "query": "motor",
          "boost": 2.05
        }
      }
    },
    {
      "match": {
        "file": {
          "query": "fuel",
          "boost": 1.35
        }
      }
    }
  ]
}
}
}

您需要创建一个
布尔查询并传递一个可以动态生成的
QueryContainer
对象数组。我已经编写了一个小代码段,它将根据您的需求构建嵌套查询。只需更新字典
boostValues
,您就可以开始了

var boostValues = new Dictionary<string, double>
{
    { "kit", 3 },
    { "motor", 2.05 },
    { "fuel", 1.35 }
};

var qc = new List<QueryContainer>();
foreach (var term in boostValues)
{
    qc.Add(
        Query<Document>.Match(m => m
            .OnField(p => p.File)
            .Boost(term.Value)
            .Query(term.Key)));
}

var searchResults = client.Search<Document>(s => s
    .Index(defaultIndex)
    .Query(q => q
        .Bool(b => b
            .Should(qc.ToArray()))));
var boostValues=新字典
{
{“kit”,3},
{“马达”,2.05},
{“燃料”,1.35}
};
var qc=新列表();
foreach(boostValues中的var项)
{
qc.添加(
匹配(m=>m
.OnField(p=>p.File)
.Boost(术语值)
.Query(term.Key));
}
var searchResults=client.Search(s=>s
.Index(默认索引)
.Query(q=>q
.Bool(b=>b
.Should(qc.ToArray());

您能提到预期的Elasticsearch JSON查询吗?当然,我添加了它。请查看我问题中的编辑。我已发布了您问题的答案。如果它解决了您的问题,请将其标记为答案:)非常感谢您的答案。
var boostValues = new Dictionary<string, double>
{
    { "kit", 3 },
    { "motor", 2.05 },
    { "fuel", 1.35 }
};

var qc = new List<QueryContainer>();
foreach (var term in boostValues)
{
    qc.Add(
        Query<Document>.Match(m => m
            .OnField(p => p.File)
            .Boost(term.Value)
            .Query(term.Key)));
}

var searchResults = client.Search<Document>(s => s
    .Index(defaultIndex)
    .Query(q => q
        .Bool(b => b
            .Should(qc.ToArray()))));