带有 hunspell 分析器的 ElasticSearch
ElasticSearch with hunspell analyzer
我想在 ElasticSearch 中创建一个索引,它存储具有一些字符串字段的特定类型的数据。语言是匈牙利语。
我 运行 具有以下正文的 HTTP PUT 命令:
{
"settings" : {
"analysis" : {
"analyzer" : {
"hu" : {
"tokenizer" : "standard",
"filter" : [ "lowercase", "hu_HU" ]
}
},
"filter" : {
"hu_HU" : {
"type" : "hunspell",
"locale" : "hu_HU",
"language" : "hu_HU"
}
}
}
},
"mappings": {
"printedArticle": {
"_source": {"enabled": false},
"properties": {
"_id": {"type": "string", "store": true},
"mysqlid": {"type": "long", "store": false},
"publishDate": {"type": "date", "format": "dateOptionalTime", "store": false},
"title": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"lead": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"content": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"participants": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"authors": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"subtitle": {"type": "string", "analyzer": "hu", "analyze": true, "store": false}
}
}
}
}
然后我插入了一条带有一些测试文本的记录,如果我 运行 通过 Elastic API 进行搜索并使用如下 GET 请求:
http://localhost:9200/mf_pa/_search?q=MYTESTTEXT
只有当我的测试文本与我的记录中的一个单词相同时,它才会创建我的记录。
我试图通过分析API:
来分析一些类似的文本
http://localhost:9200/mf_pa/_analyze?analyzer=hu&text=My text to tokenize
它正确地标记了我的测试文本。基于这个事实,我希望如果我将以前找到的标记放入我的搜索查询中,它会找到记录,但事实并非如此。
对于英文示例,我会说我的文本是 'unforgettable',我的查询是 'forget'。
我应该怎么做才能找到记录?
如果分析器使用 Analyze API 进行测试,它也应该在映射中工作。以下是一些需要检查的事项:
确保映射输入成功。 GET /mf_pa/_mapping
例如"analyze": true
应该是"index": "analyzed"
确保测试文档确实被正确索引为 printedArticle
类型。
GET /mf_pa/_search
你的测试文档应该return "_type": "printedArticle"
.
您还可以使用分析 API 来验证文本将如何针对特定字段进行分析(以确保分析器正确应用于该字段)
例如GET /mf_pa/_analyze/?field=title&text=A kőszivű ember fiai
我想在 ElasticSearch 中创建一个索引,它存储具有一些字符串字段的特定类型的数据。语言是匈牙利语。
我 运行 具有以下正文的 HTTP PUT 命令:
{
"settings" : {
"analysis" : {
"analyzer" : {
"hu" : {
"tokenizer" : "standard",
"filter" : [ "lowercase", "hu_HU" ]
}
},
"filter" : {
"hu_HU" : {
"type" : "hunspell",
"locale" : "hu_HU",
"language" : "hu_HU"
}
}
}
},
"mappings": {
"printedArticle": {
"_source": {"enabled": false},
"properties": {
"_id": {"type": "string", "store": true},
"mysqlid": {"type": "long", "store": false},
"publishDate": {"type": "date", "format": "dateOptionalTime", "store": false},
"title": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"lead": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"content": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"participants": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"authors": {"type": "string", "analyzer": "hu", "analyze": true, "store": false},
"subtitle": {"type": "string", "analyzer": "hu", "analyze": true, "store": false}
}
}
}
}
然后我插入了一条带有一些测试文本的记录,如果我 运行 通过 Elastic API 进行搜索并使用如下 GET 请求:
http://localhost:9200/mf_pa/_search?q=MYTESTTEXT
只有当我的测试文本与我的记录中的一个单词相同时,它才会创建我的记录。
我试图通过分析API:
来分析一些类似的文本http://localhost:9200/mf_pa/_analyze?analyzer=hu&text=My text to tokenize
它正确地标记了我的测试文本。基于这个事实,我希望如果我将以前找到的标记放入我的搜索查询中,它会找到记录,但事实并非如此。
对于英文示例,我会说我的文本是 'unforgettable',我的查询是 'forget'。 我应该怎么做才能找到记录?
如果分析器使用 Analyze API 进行测试,它也应该在映射中工作。以下是一些需要检查的事项:
确保映射输入成功。
GET /mf_pa/_mapping
例如
"analyze": true
应该是"index": "analyzed"
确保测试文档确实被正确索引为
printedArticle
类型。GET /mf_pa/_search
你的测试文档应该return"_type": "printedArticle"
.您还可以使用分析 API 来验证文本将如何针对特定字段进行分析(以确保分析器正确应用于该字段)
例如
GET /mf_pa/_analyze/?field=title&text=A kőszivű ember fiai