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()))));