将Solr中的简单edismax查询转换为Elastic Search

时间:2019-05-23 23:04:29

标签: json elasticsearch solr

在Solr中,我有一个与以下参数一起使用的用户名索引:

输入用户名后,我会分别搜索每个术语,也一起搜索每个术语(因此要加引号),这样,全名的匹配度会比其他任何查询都高。这很好用,但是我正在努力在Elastic搜索中创建等效项。

  "q":"((Billy AND Smith) OR \"Billy Smith\") AND status:active",
  "tie":".1",
  "defType":"edismax",
  "qf":"email^6 wholename^5 wholename.edge^3 firstname^2 nickname^1.5 lastname^1 firstname.edge^.5 lastname.edge^.3 wholename.phonetic^.3 nickname.phonetic^0.1",
  "sort":"score desc, id asc"

因为我要在至少一个字段中搜索所有这些术语,所以不能使用“ most_fields”或“ best_fields”,因为“ and”运算符意味着我输入的所有术语都必须存在于一个字段中,因此输入多个字词永远不会产生我想要的结果。我使用cross_fields并进行了查询,因为我发现将multi_match用于具有不同分析器的字段存在问题:"The cross_field type can only work in term-centric mode on fields that have the same analyzer. "

我正在尝试类似下面的示例,但这是不对的,因为它基本上是说只要一个术语(billy,smith,或在使用关键字标记器的情况下都可以)。“ billy smith” )匹配一个字段。仅当所有术语都至少匹配一个字段时,我在Solr中的查询才会通过。没有“。”的字段正在使用精确匹配分析器(关键字标记器和小写过滤器等),以便我可以确定精确匹配的优先级。我已经使用_analyze API测试了分析仪,因此我知道分析仪正在工作。我只是不知道如何问Elastic如何给我我想要的东西。例如,如果用户输入了Luke Walton Jr,我希望所有这三个字词都与我提供的任何一个字词中的至少一个字段匹配。

{
 "query": {
    "bool" : {
        "minimum_should_match" : 1,
        "should" : [{
            "multi_match" : {
                  "query" : "billy smith",
                  "type": "cross_fields",
                  "fields" : ["email^6", "wholename^5", "firstname^2", "nickname^1.5" "lastname^1"], 
                  "tie_breaker":0.15
            }},
            {
             "multi_match" : {
                  "query" : "billy smith",
                  "type": "cross_fields",
                  "fields" : ["wholename.edge^3", "firstname.edge^2", "lastname.edge^1"], 
                  "tie_breaker":0.15
            }},
            {
             "multi_match" : {
                  "query" : "billy smith",
                  "type": "cross_fields",
                  "fields" : ["wholename.phonetic^0.9", "nickname.phonetic^0.1"], 
                  "tie_breaker":0.15
            }
        }], 
        "filter" :{
            "term": {"status":"active"}
        }
    }

}

}

更新:

我已经开始成功使用查询字符串查询,但是当包含空格时,它似乎不像广告中所说的那样工作。它将“比利”和“史密斯”都匹配到各自的字段,但在整个名称字段中不匹配任何内容,在此示例中,该字段是“ billy smith”。我尝试在其周围添加转义的引号,但结果没有变化。

{
    "size": 10,
    "query": {
        "query_string" : {
            "default_operator" : "AND",
            "fields" : ["email^6", "wholename^5", "firstname^2", "nickname^1.5" "lastname^1", "wholename.edge^3", "firstname.edge^2", "lastname.edge^1", "wholename.phonetic^0.9", "nickname.phonetic^0.1"],
            "query" : "Billy Smith"
        }
    }
}

0 个答案:

没有答案