我正在寻找一种方法来处理elasticsearch与文档名称的相关性,例如“bottle”和“瓶盖”
当有人寻找“瓶子”(搜索词)时, - “瓶盖”的得分应低于“红瓶”。
目前我们的搜索引擎得分“红色瓶子”与“500ml瓶装瓶盖”相关性较低
答案 0 :(得分:1)
这不是您可以在Elasticsearch中解决的问题,而无需添加更多信息。你想要排名"红瓶"过度"瓶盖"因为你知道这些名字的语义信息 - 你知道"红瓶"意味着它所谈论的是一瓶"瓶盖"瓶盖"意味着它所谈论的东西是其他东西(与瓶子有关,但实际上不是瓶子)。如果您希望Elasticsearch的排名考虑到这些信息,您必须为信息编制索引(可能会添加一个关键字标记字段,一个用"一瓶"一个用"瓶盖" - - 您将不得不尝试查看哪些内容适用于您的用例)。当然,这意味着一个人必须为所有内容添加广告标签。
但是,我怀疑你可以通过unique filter改善一些情况。我的猜测是你不会在一个标题中关注术语频率(" 500ml瓶装瓶盖"瓶子更多关于瓶子因为"瓶子"它出现了两次 - 术语频率对我认为这样的标题没什么意义。所以你可以这样做:
PUT /myindex
{
"settings": {
"index": {
"number_of_shards": 1
},
"analysis": {
"analyzer": {
"uniq_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"porter_stem",
"unique"
]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"name": {
"type": "text",
"analyzer": "uniq_analyzer"
}
}
}
}
}
PUT /myindex/doc/1
{"name": "Red coloured bottles"}
PUT /myindex/doc/2
{"name": "Bottle caps for 500ml bottle"}
然后,如果您搜索bottle
,您会看到得分相同 - 不完美,但有所改善。如果您想了解分数的来源,可以使用explain:
POST /myindex
{
"explain": true,
"query": {
"match":
{"name": "bottle"}
}
}