当前位置:  开发笔记 > 数据库 > 正文

当搜索单个"已加星标"的术语时,Elasticsearch会为所有结果输出1.0分

如何解决《当搜索单个"已加星标"的术语时,Elasticsearch会为所有结果输出1.0分》经验,为你挑选了1个好方法。

我们使用Elasticsearch搜索特定目录中最相关的公司.当我们使用正常搜索词时,lettering我们得到合理的分数,并可以根据分数对结果进行排序.

但是,当我们在查询之前修改搜索项并使其"加星标"版本(例如*lettering*)能够搜索子字符串时,我们得到的结果为1.0.搜索子串是项目中的一项要求.

关于什么可能导致这种相关性计算的想法?仅在使用单个术语时才会出现此问题.当我们组合使用两个加星标的术语时,我们会得到可理解的分数(例如*lettering* *digital*).

编辑1:

示例性映射(YAML,其他属性以相同的方式映射,除了对每个属性不同的boost):

    elasticSearchMapping:
      type: object
      include_in_all: true
      enabled: true
      properties:
        'keywords':
          type: string
          include_in_all: true
          boost: 50

查询:

{
"query": {
    "filtered": {
        "query": {
            "bool": {
                "must": [{
                    "match_all": []
                }, {
                    "query_string": {
                        "query": "*lettering*"
                    }
                }]
            }
        },
        "filter": {
            "bool": {
                "must": [{
                    "term": {
                        "__parentPath": "/sites/industrycatalog"
                    }
                }, {
                    "terms": {
                        "__workspace": ["live"]
                    }
                }, {
                    "term": {
                        "__dimensionCombinationHash": "d751713988987e9331980363e24189ce"
                    }
                }, {
                    "term": {
                        "__typeAndSupertypes": "IndustryCatalog:Entry"
                    }
                }],
                "should": [],
                "must_not": [{
                    "term": {
                        "_hidden": true
                    }
                }, {
                    "range": {
                        "_hiddenBeforeDateTime": {
                            "gt": "now"
                        }
                    }
                }, {
                    "range": {
                        "_hiddenAfterDateTime": {
                            "lt": "now"
                        }
                    }
                }]
            }
        }
    }
},
"fields": ["__path"],
"script_fields": {
    "distance": {
        "script": "doc['coordinates'].distanceInKm(51.75631079999999,14.332867899999997)"
    }
},
"sort": [{
    "customer.featureFlags.industrycatalog": {
        "order": "asc"
    }
}, {
    "_geo_distance": {
        "coordinates": {
            "lat": "51.75631079999999",
            "lon": "14.332867899999997"
        },
        "order": "asc",
        "unit": "km",
        "distance_type": "plane"
    }
}],
"size": 999999

}



1> ChintanShah2..:

你正在做的是wildcard query,他们属于term level queries,默认情况下constant score应用.

检查Lucene文档,WildcardQuery 扩展 MultiTermQuery

您也可以在explain api的帮助下验证这一点,您将会这样

"_explanation": {
     "value": 1,
     "description": "ConstantScore(company:lettering), product of:",
     "details": [{
         "value": 1,
         "description": "boost"
     }, {
         "value": 1,
         "description": "queryNorm"
     }]
 }

您可以通过重写来更改此行为,

试试这个,rewrite也适用query string query

{
  "query": {
    "wildcard": {
      "company": {
        "value": "digital*",
        "rewrite": "scoring_boolean"
      }
    }
  }
}

它有各种评分选项,看看哪些符合您的要求.

编辑1,你看到得分不是1的*lettering* *digital*原因是queryNorm,你可以再次检查explain api,如果你仔细观察,所有两个匹配的文件将具有相同的分数,单个匹配的文件也将具有相同的分数.

PS:根本不建议使用领先的通配符.您将获得性能问题,因为它要检查每一个学期inverted index.您可能想要检查边缘ngram或ngram过滤器

希望这可以帮助!

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有