我正在使用ElasticSearch构建一个显示书籍列表的应用程序。 每本书都可以标记为收藏。该页面将在当前用户的结果列表顶部显示收藏的书籍。
以下是一些对象
public class User {
private String id;
private String name;
//getters/setters
}
文档
public class Book
{
private String name;
private List<User> favoriteOfUsers;
//getters/setters
}
我想搜索列表并命令它们在结果列表的顶部获取当前用户的收藏书籍。 请告诉我如何为此用例构建解决方案?
答案 0 :(得分:1)
我认为您正在寻找Elasticsearch的排序选项:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html
假设赞成书籍的用户被存储为Book文档中的嵌套列表,您可能希望在Elasticsearch的{{1}}中使用nested_filter
选项:
sort
希望这能指出你正确的方向。
答案 1 :(得分:1)
您可以使用Function scoring。假设您的文档类型为:
{
"_index": "book",
"_type": "book",
"_id": "1",
"_score": 1,
"_source": {
"name": "book1",
"favoriteOfUsers": [
{
"id": 1,
// other properties of user
},
{
"id": 2,
// other properties of user
},
{
"id": 3,
// other properties of user
}
]
}
}
您可以使用以下查询
POST book/book/_search
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": {
"script": "if(_source.favoriteOfUsers*.id.contains(id)) {_score*10} else _score",
"params": {
"id": 5
}
}
}
]
}
}
}
如果您担心安全问题,可以使用此Running Groovy Scripts without Dynamic Scripting