我试图通过"created“字段(一个整数/时间戳)来提高搜索效率,但总是遇到
"{"error":{"root_cause":[{"type":"parsing_exception","reason":"Unknown key for a START_OBJECT in [script].","line":1,"col":181}],"type":"parsing_exception","reason":"Unknown key for a START_OBJECT in [script].","line":1,"col":181},"status":400}"没有'script‘,查询就能正常工作。但是我已经没有办法正确地编写这个脚本了。有什么想法吗?
return [
'index' => 'articles_' . $this->system,
'body' => [
'size' => $this->size,
'from' => $this->start,
'sort' => [
$this->order => 'desc',
],
'query' => [
'query_string' => [
'query' => $this->term,
'fields' => ['title^5', 'caption^3', 'teaser^2', 'content'],
'analyze_wildcard' => true,
],
'script' => [
'script' => [
'lang' => 'painless',
'source' => "doc['@created'].value / 100000",
],
],
],
],
];编辑:已更新查询,但仍遇到"{"error":{"root_cause":[{"type":"parsing_exception",“原因”:“query_string查询格式错误,应为END_OBJECT但找到FIELD_NAME",”行“:1,”列“:171}],”类型“:”parsing_exception“,”原因“:”query_string格式查询,应为END_OBJECT但找到FIELD_NAME",“行”:1,“列”:171},“状态”:400}“
发布于 2019-09-27 15:07:35
脚本不是独立属性。它应该是bool的一部分。当您有多个过滤器时,这些过滤器应该在必须/应该/过滤器中的bool下
'body' => [
'size' => $this->size,
'from' => $this->start,
'sort' => [
$this->order => 'desc'
],
'query' => [
'bool' => [
'must' =>[
'query_string' => [
'query' => $this->term,
'fields' => ['title^5', 'caption^3', 'teaser^2', 'content'],
'analyze_wildcard' => true
],
'script' => [
'script' => [
'lang' => 'painless',
'source' => "doc['@created'].value / 100000"
]
]
]
]
]
]上面可能有括号的语法问题(我无法测试它),查询结构是正确的
发布于 2019-10-02 19:02:42
...
'query' => [
'function_score' => [
'query' => [
'query_string' => [
'query' => $this->term,
'fields' => ['title^10', 'caption^8', 'teaser^5', 'content'],
'analyze_wildcard' => true,
],
],
'script_score' => [
'script' => [
'lang' => 'expression',
'source' => "_score + (doc['created'] / 10000000000000)",
],
],
],
],是我最终的解决方案。遗憾的是,后来在elasticsearch的文档中找到了它。但你真的必须强烈地划分时间戳,以确保它不会完全压倒最佳匹配。
https://stackoverflow.com/questions/58114424
复制相似问题