我们使用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
}
你正在做的是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过滤器
希望这可以帮助!