作为Elasticsearch的新手,我不确定使用同义词的最佳方法是什么。
我有两个字段,一个是主题标签,另一个是名称。 Hashtag包含小写但没有空格的名称,而name包含camel case格式的实际名称。
我想基于正确格式的名称进行搜索,并希望获得所有匹配的名称以及与hashtag匹配的文档。
例如,名字包含"汤姆克鲁斯"和#标签是" tomcruise"。我想搜索汤姆克鲁斯"并且预期结果是它将返回所有具有名称和#34; Tom Cruise"或标签" tomcruise"。
以下是我创建此索引的方式:
PUT /my_index
{
"settings": {
"number_of_shards": 1,
"analysis": {
"filter": {
"synonym" : {
"type" : "synonym",
"ignore_case" : true,
"synonyms" : [
"tom cruise => tomcruise, tom cruise"
]
}
},
"analyzer": {
"synonym" : {
"tokenizer" : "whitespace",
"filter" : ["synonym"]
}
}
}
}
}
PUT /my_index/my_type/_mapping
{
"my_type": {
"properties": {
"hashtag": {
"type": "string",
"search_analyzer": "synonym",
"analyzer": "standard"
},
"name":{
"type": "keyword"
}
}
}
}
POST /my_index/my_type/_bulk
{ "index": { "_id": 1 }}
{ "hashtag": "tomcruise", "name": "abc" }
{ "index": { "_id": 2 }}
{ "hashtag": "tomhanks", "name": "efg" }
{ "index": { "_id": 3 }}
{ "hashtag": "tomcruise" , "name": "efg" }
{ "index": { "_id": 4 }}
{ "hashtag": "news" , "name": "Tom Cruise"}
{ "index": { "_id": 5 }}
{ "hashtag": "celebrity", "name": "Kate Winslet" }
{ "index": { "_id": 6 }}
{ "hashtag": "celebrity", "name": "Tom Cruise" }
当我分析时,看起来我得到了正确的代币:[tomcruise,tom,cruise]
GET /my_index/_analyze
{
"text": "Tom Cruise",
"analyzer": "synonym"
}
以下是我的搜索方式:
POST /my_index/my_type/_search?pretty
{
"query":
{
"multi_match": {
"query": "Tom Cruise",
"fields": [ "hashtag", "name" ]
}
}
}
更新
在与Russ Cam讨论并与我对Elasticsearch的一点知识后,我认为使用同义词来满足我的搜索要求会有点过分。所以我改变了搜索分析器来生成相同的令牌并得到了相同的结果。仍然想知道我是否以正确的方式做到了。
PUT /my_index
{
"settings": {
"number_of_shards": 1,
"analysis": {
"filter": {
"word_joiner": {
"type": "word_delimiter",
"catenate_all": true
}
},
"analyzer": {
"test_analyzer" : {
"type": "custom",
"tokenizer" : "keyword",
"filter" : ["lowercase", "word_joiner"]
}
}
}
}
}