从多个字段Elastic Search的集合中随机自由文本搜索

时间:2015-09-11 11:47:06

标签: elasticsearch mongoose mongoosastic

我们正在使用Elastic Search,MongoDB,mongoosastic

假设

User:{
  username:String,
  city : String,
  country:String 
   etc 
}

这种类型的文档存储在弹性搜索中,现在如果用户搜索abhay sikandrabad然后首先尝试找到abhay和sikandrabad。 abhay,sikandrabad可能出现在这些东西中的任何一个用户名,城市,国家。所以基本上它从每个字段搜索,如果它不匹配,那么尝试匹配abhay,如果没有找到abhay的数据,那么尝试找到sikandrabad

这种类型的东西是否已在Elastic Search中实现,或者我必须为此编写代码?

3 个答案:

答案 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 querybest_fields模式。即使有所有单词匹配的记录,它仍会返回只有一个单词匹配的记录,但所有单词的记录将显示在列表的顶部。

答案 2 :(得分:-1)

如果要在多个字段中搜索值,请增加should方法的数量并传递更多字段键。如果您想优先考虑字段,请将.should替换为.must

  

.setQuery(QueryBuilders.boolQuery()
  .should(QueryBuilders.matchQuery(field1_key,value))
  .should(QueryBuilders.matchQuery(field 2_key,value)))