我们正在使用Elastic Search,MongoDB,mongoosastic
假设
User:{
username:String,
city : String,
country:String
etc
}
这种类型的文档存储在弹性搜索中,现在如果用户搜索abhay sikandrabad然后首先尝试找到abhay和sikandrabad。 abhay,sikandrabad可能出现在这些东西中的任何一个用户名,城市,国家。所以基本上它从每个字段搜索,如果它不匹配,那么尝试匹配abhay,如果没有找到abhay的数据,那么尝试找到sikandrabad
这种类型的东西是否已在Elastic Search中实现,或者我必须为此编写代码?
答案 0 :(得分:2)
如果可以重新创建索引,则为此目的使用custom _all字段。索引时间优化将为您提供比搜索时间优化更好的性能。因此,您可以创建如下映射:
PUT /my_index/_mapping/my_mapping
{
"_all": {"enabled": false},
"properties": {
"custom_all": {
"type": "string"
},
"username": {
"copy_to": "custom_all",
"type": "string"
},
"city": {
"copy_to": "custom_all",
"type": "string"
},
"country": {
"copy_to": "custom_all",
"type": "string"
}
}
无论您想要搜索哪个字段,都可以使用copy_to param将它们包含在custom_all字段中。现在,您可以在custom_all字段上执行搜索。
GET /my_index/my_mapping/_search
{
"query": {
"match": {
"custom_all": "text to match"
}
}
}
如果要为用户名匹配的记录提供更高的优先级,可以使用这样的bool查询:
GET /my_index/my_mapping/_search
{
"query": {
"bool": {
"must": {
"match": {"custom_all": "text to match"}
},
"should": [
{ "match": { "username": "text to match" } }
]
}
}
}
must子句确保查询与custom_all字段匹配。 should子句确定文档的分数。如果should子句匹配,则得分会更高。同样,在数组中添加更多should子句将包括不同的评分标准。您还可以向should子句添加boost参数,以确定哪个字段对总分数的贡献。希望这会有所帮助。
答案 1 :(得分:0)
我认为对您所描述内容的最接近的查询是multi_match query的best_fields
模式。即使有所有单词匹配的记录,它仍会返回只有一个单词匹配的记录,但所有单词的记录将显示在列表的顶部。
答案 2 :(得分:-1)
如果要在多个字段中搜索值,请增加should
方法的数量并传递更多字段键。如果您想优先考虑字段,请将.should
替换为.must
。
.setQuery(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery(field1_key,value))
.should(QueryBuilders.matchQuery(field 2_key,value)))