我们使用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
Run Code Online (Sandbox Code Playgroud)
查询:
{
"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
Run Code Online (Sandbox Code Playgroud)
}
你正在做的是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"
}]
}
Run Code Online (Sandbox Code Playgroud)
您可以通过重写来更改此行为,
试试这个,rewrite也适用query string query
{
"query": {
"wildcard": {
"company": {
"value": "digital*",
"rewrite": "scoring_boolean"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它有各种评分选项,看看哪些符合您的要求.
编辑1,你看到得分不是1的*lettering* *digital*原因是queryNorm,你可以再次检查explain api,如果你仔细观察,所有两个匹配的文件将具有相同的分数,单个匹配的文件也将具有相同的分数.
PS:根本不建议使用领先的通配符.您将获得性能问题,因为它要检查每一个学期的inverted index.您可能想要检查边缘ngram或ngram过滤器
希望这可以帮助!