Elasticsearch/Nest - 将 MatchPhrase 与 OnFieldsWithBoost 结合使用
Elasticsearch/Nest - using MatchPhrase with OnFieldsWithBoost
在我今天的代码中,我正在做这样的搜索:
.Query(q => q.QueryString(qs => qs.Query(searchQuery).OnFieldsWithBoost(f => f.Add(b => b.MetaTitle, 5).Add(b => b.RawText, 1))))
我的问题是,如果我搜索像这样的短语,这会给我一个非常广泛的搜索范围。 "The sun is shining"。我试过在 RawText 上使用 MatchPhrase,而不是 QueryString,这有点管用。
问题是我仍然想在 MetaTitle 和 RawText 中搜索,并使用我现在使用的提升。
我不知道 Nest,但你想做的是使用 multi-match query of phrase type, with fields boost。
对 g**gle 的快速搜索为我提供了类似这样的增强部分语法:
.Query(q => q
.MultiMatch(m => m
.OnFieldsWithBoost(b => b
.Add(o => o.MyField, 2.0)
.Add(o => o.AnotherField, 3.0)
)
.Type(TextQueryType.Phrase)
.Query("my query text")
)
)
API 必须有某种 type
参数才能向其添加 phrase
类型。
编辑:快速查看sources后,我找到了上面添加的Type方法。
因为我还没有找到没有定义给定类型的多匹配查询搜索的例子。我花了几天时间尝试解决这个问题,然后想出了解决方案。
我在 C# 中使用 NEST 库。这里我保留与上面相同的方法,但使用泛型,并传递一个带有字段和提升的字典,因为你不会有用流利的表达的智能写作。我还添加了 skip 和 take(或 from 和 size)方法、搜索类型和要执行搜索的索引数组。
var dic = new FluentDictionary<string, double?>();
dic.Add("Field1", 1.0);
dic.Add("Field2", 1.0);
var response = Client.Search<T>(s => s
.Skip(0)
.Take(5)
.Indices(indexes)
.Query(q => q
.MultiMatch(m => m
.OnFieldsWithBoost(b =>
{
foreach (var entry in dic)
b.Add(entry.Key, entry.Value);
})
.Type(TextQueryType.Phrase)
.Query("your query text")
)
)
);
在我今天的代码中,我正在做这样的搜索:
.Query(q => q.QueryString(qs => qs.Query(searchQuery).OnFieldsWithBoost(f => f.Add(b => b.MetaTitle, 5).Add(b => b.RawText, 1))))
我的问题是,如果我搜索像这样的短语,这会给我一个非常广泛的搜索范围。 "The sun is shining"。我试过在 RawText 上使用 MatchPhrase,而不是 QueryString,这有点管用。
问题是我仍然想在 MetaTitle 和 RawText 中搜索,并使用我现在使用的提升。
我不知道 Nest,但你想做的是使用 multi-match query of phrase type, with fields boost。
对 g**gle 的快速搜索为我提供了类似这样的增强部分语法:
.Query(q => q
.MultiMatch(m => m
.OnFieldsWithBoost(b => b
.Add(o => o.MyField, 2.0)
.Add(o => o.AnotherField, 3.0)
)
.Type(TextQueryType.Phrase)
.Query("my query text")
)
)
API 必须有某种 type
参数才能向其添加 phrase
类型。
编辑:快速查看sources后,我找到了上面添加的Type方法。
因为我还没有找到没有定义给定类型的多匹配查询搜索的例子。我花了几天时间尝试解决这个问题,然后想出了解决方案。
我在 C# 中使用 NEST 库。这里我保留与上面相同的方法,但使用泛型,并传递一个带有字段和提升的字典,因为你不会有用流利的表达的智能写作。我还添加了 skip 和 take(或 from 和 size)方法、搜索类型和要执行搜索的索引数组。
var dic = new FluentDictionary<string, double?>();
dic.Add("Field1", 1.0);
dic.Add("Field2", 1.0);
var response = Client.Search<T>(s => s
.Skip(0)
.Take(5)
.Indices(indexes)
.Query(q => q
.MultiMatch(m => m
.OnFieldsWithBoost(b =>
{
foreach (var entry in dic)
b.Add(entry.Key, entry.Value);
})
.Type(TextQueryType.Phrase)
.Query("your query text")
)
)
);