【发布时间】:2015-12-17 11:29:20
【问题描述】:
我想在 Elasticsearch 中实现同义词单向搜索。一种方式搜索意味着如果我定义 a => x,y,z 并搜索“a”,搜索结果应该包括所有包含单词 x,y,z,a 的文档,这些文档现在正在工作。但如果我搜索“x”,则搜索结果应该包含仅包含“x”而不包含“a”的文档。
这在 Elasticsearch 中可行吗?
【问题讨论】:
标签: elasticsearch type-synonyms
我想在 Elasticsearch 中实现同义词单向搜索。一种方式搜索意味着如果我定义 a => x,y,z 并搜索“a”,搜索结果应该包括所有包含单词 x,y,z,a 的文档,这些文档现在正在工作。但如果我搜索“x”,则搜索结果应该包含仅包含“x”而不包含“a”的文档。
这在 Elasticsearch 中可行吗?
【问题讨论】:
标签: elasticsearch type-synonyms
您不能在同义词关系中执行此操作,因为您要解释的行为是 hyperonym/hyponym 关系。
您可以在index-time 上实现这样的行为。
因此,对于a 的每次出现,您还可以索引x,y,z。为此使用一个额外的字段将是一个好主意,以免弄乱分数。
遗憾的是,这种行为不是 elasticsearch 的一部分,必须在提供数据时手动实现。
【讨论】:
我通过反转同义词表达式实现了单向同义词:
例如:
Robert => Bob, Rob
Bob => Robert
但是我不得不使用这个带有同义词的分析器是不同的方式。 在映射中,同义词与一个新字段挂钩:
"FirstName": {
"type": "string",
"analyzer": "standard",
"search_analyzer": "standard",
"fields": {
"raw": {
"type": "string",
"analyzer": "standard"
},
"synonym": {
"type": "string",
"analyzer": "firstname_synonym_analyzer"
}
}
},
搜索看起来像这样:
"bool": {
"should": [
{
"match": {
"FirstName": {
"query": "Jo"
}
}
},
{
"match": {
"FirstName.synonym": {
"query": "Jo"
}
}
}
],
"minimum_should_match": 1
}
这样第一个字段包含正常值,第二个只是可能的同义词。所以寻找Bob 会找到Robert,但不会找到Rob。
【讨论】:
我会使用generic expansion aka genre expansion 和不同的索引时间和查询时间分析器来实现它
索引时间的同义词:
Bob => Bob, Robert
Rob => Rob, Robert
格式是这样的
word => the same word, more generic word, even more generic, etc
查询时间:未应用同义词
查询“Bob”将只返回“Bob”所在的文档。
查询“Rob”将只返回“Rob”所在的文档。
查询“Robert”将返回“Bob”、“Rob”和“Robert”所在的文档。
【讨论】: