注意到我对索引字符串字段的排序无法正常工作,我发现它对已分析的字符串进行排序,所以"单词袋",如果我想让它正常工作,就必须对未分析的字符串排序。我的计划是使用我在这两篇文章中找到的信息,将字符串字段更改为多字段:
https://www.elastic.co/blog/changing-mapping-with-zero-downtime(升级为多字段部分)https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html
使用Sense我创建了这个字段映射
PUT myindex/_mapping/type
{
"properties": {
"Title": {
"type": "string",
"fields": {
"Raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
然后我尝试使用新创建的字段对搜索结果进行排序。在阅读了这些文章后,我已经列出了我能想到的所有名称变体:
POST myindex/_search
{
"_source" : ["Title","titlemap.Raw","titlemap.Title","titlemap.Title.Raw","Title.Title","Raw","Title.Raw"],
"size": 6,
"query": {
"multi_match": {
"query": "title",
"fields": ["Title^5"
],
"fuzziness": "auto",
"type": "best_fields"
}
},
"sort": {
"Title.Raw": "asc"
}
}
这就是我得到的回应:
{
"_index": "myindex_2015_11_26_12_22_38",
"_type": "type",
"_id": "1205",
"_score": null,
"_source": {
"Title": "The title of the item"
},
"sort": [
null
]
}
响应中只显示Title字段的值,并且每个结果的排序标准都为null。
我做错了什么吗,或者有其他方法可以做吗?
重新索引后,索引名称不相同,因此安装了默认映射。。。这可能就是为什么。
我建议使用索引模板,这样你就不必关心何时创建索引,ES会为你做这件事。其想法是创建一个具有所需正确映射的模板,然后ES将在其认为必要时创建每个新索引,添加myindex
别名并对其应用正确映射。
curl -XPUT localhost:9200/_template/myindex_template -d '{
"template": "myindex_*",
"settings": {
"number_of_shards": 1
},
"aliases": {
"myindex": {}
},
"mappings": {
"type": {
"properties": {
"Title": {
"type": "string",
"fields": {
"Raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}'
然后,每当您启动重新索引过程时,都会创建一个具有新名称的新索引,但要使用正确的映射和正确的别名。