了解Elasticsearch同义词

时间:2016-08-21 04:59:41

标签: elasticsearch kibana elasticsearch-plugin

作为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" ]
    }
  }
}
  • 这是归档搜索要求的正确方法吗?
  • 在Kibana上搜索这样的最佳方式是什么?我必须使用整个查询,但如果我只想键入" Tom Cruise"我需要做什么?并希望得到预期的结果?我试过" _all"但是没有用。

更新

在与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"]
                }
            }
        }
    }
}

0 个答案:

没有答案