我有一个关于根据创建日期修改得分文档的问题。我尝试过高斯函数和field_value_factor。
第一个是(所有查询条款):
@search_definition[:query] = {
function_score:{
query: {
bool: {
must: [
{
query_string: {
query: <query_term>,
fields: %w( field_1ˆ2
field_2ˆ3
...
field_n^2),
analyze_wildcard: true,
auto_generate_phrase_queries: false,
analyzer: 'brazilian',
default_operator: 'AND'
}
}
],
filter: {
bool: {
should: [
{ term: {"boolean_field": false}},
{ terms: {"array_field_1": options[:key].ids}},
{ term: {"array_field_2.id": options[:key].id}}
]
}
}
}
},
gauss:{
date_field: {
scale: "1d",
decay: "0.5"
}
}
}
}
通过这种配置,我告诉我们,最后的文件必须有更高的分数。当我用它执行查询时,结果完全相反!最早的文件首先被退回。即使我将原点更改为
origin: "2010-05-01 00:00:00"
这是第一个文档的日期,最早的文档也是首先被检索的。我做错了什么?
使用field_value_factor,事情会更好,但还不是我在等什么......(所有查询子句都是)
@search_definition[:query] = {
function_score:{
query: {
bool: {
must: [
{
query_string: {
query: <query_term>,
fields: %w( field_1ˆ2
field_2ˆ3
...
field_n^2),
analyze_wildcard: true,
auto_generate_phrase_queries: false,
analyzer: 'brazilian',
default_operator: 'AND'
}
}
],
filter: {
bool: {
should: [
{ term: {"boolean_field": false}},
{ terms: {"array_field_1": options[:key].ids}},
{ term: {"array_field_2.id": options[:key].id}}
]
}
}
}
},
field_value_factor: {
field: "date_field",
factor : 100,
modifier: "sqrt"
}
}
}
通过这种其他配置,2016年和2015年的文件将首先返回,但是从2016年开始,大量的文档得分低于2015年的其他文档,即使我设置了修饰符&#34; sqrt&#34;因素:100 !!!!
我认为guass功能将是合适的解决方案。如何反转这个高斯结果?或者我如何增加field_value_factor以使2016年到来之前?
非常感谢,
吉尔赫尔梅
答案 0 :(得分:5)
您可能想尝试将高斯函数内部functions param放入其中,并像下面的查询一样给它一个权重。我还认为规模太低,可能会使很多文件得分为零。我也将衰减增加到0.8并且给予最近的文件更高的权重。您还可以使用explain api查看评分是如何完成的。
TcpListener _server = new TcpListener(_localAddr, _port);
_server.Start();
while (true)
{
if (_server.Pending())
{
Byte[] bytes = new Byte[256];//Works fine if message under this size
string data = string.Empty;
_client = _server.AcceptTcpClient();
NetworkStream stream = _client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
data = data.ToUpper();
//Do stuff with data
}
}
此外,原点应为最新日期,而不是{
"function_score": {
query: {
bool: {
must: [{
query_string: {
query: < query_term > ,
fields: % w(field_1ˆ2 field_2ˆ3
...field_n ^ 2),
analyze_wildcard: true,
auto_generate_phrase_queries: false,
analyzer: 'brazilian',
default_operator: 'AND'
}
}],
filter: {
bool: {
should: [{
term: {
"boolean_field": false
}
}, {
terms: {
"array_field_1": options[: key].ids
}
}, {
term: {
"array_field_2.id": options[: key].id
}
}]
}
}
}
},
"functions": [{
"gauss": {
"date_field": {
"origin": "now"
"scale": "30d",
"decay": "0.8"
}
},
"weight": 20
}]
}
}
,请尝试
origin: "2010-05-01 00:00:00"
这有帮助吗?