在嵌套弹性搜索中使用原始字符串创建查询
Creating query with raw strings in nest elasticsearch
我需要动态创建查询。我在哈希表中有一个术语列表,它们的权重各不相同。我想在大量文档的内容中搜索这些术语,并根据其权重提升每个单词。类似于下面的代码:
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))))
我找到的唯一解决方案是像 link http://nest.azurewebsites.net/nest/writing-queries.html
中的示例那样使用 "Raw String"
.QueryRaw(@"{""match_all"": {} }")
.FilterRaw(@"{""match_all"": {} }")
因为每次都不知道有多少term,请问这样的问题怎么办?有谁知道 "Raw strings" 之外的另一种解决方案吗?
我正在使用 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
}
}
}
]
}
}
}
您需要创建一个 Bool Should
查询并传递可以动态生成的 QueryContainer
对象数组。我已经编写了一个小代码片段,它将根据您的要求构建 Nest 查询。只需更新字典 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 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))))
我找到的唯一解决方案是像 link http://nest.azurewebsites.net/nest/writing-queries.html
中的示例那样使用 "Raw String".QueryRaw(@"{""match_all"": {} }")
.FilterRaw(@"{""match_all"": {} }")
因为每次都不知道有多少term,请问这样的问题怎么办?有谁知道 "Raw strings" 之外的另一种解决方案吗? 我正在使用 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
}
}
}
]
}
} }
您需要创建一个 Bool Should
查询并传递可以动态生成的 QueryContainer
对象数组。我已经编写了一个小代码片段,它将根据您的要求构建 Nest 查询。只需更新字典 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()))));