【发布时间】:2017-02-23 19:17:20
【问题描述】:
我尝试通过配置其映射和设置来设置新索引。
这是我使用的代码:
POST /test/text
{
"settings": {
"analysis": {
"filter": {
"greek_stop": {
"type": "stop",
"stopwords": "_greek_"
},
"greek_lowercase": {
"type": "lowercase",
"language": "greek"
},
"greek_stemmer": {
"type": "stemmer",
"language": "greek"
}
},
"analyzer": {
"greek": {
"tokenizer": "standard",
"filter": [
"greek_lowercase",
"greek_stop",
"greek_stemmer"
]
}
}
}
},
"mappings": {
"article": {
"properties": {
"title": {
"type": "string",
"fields": {
"greek": {
"type": "string",
"analyser": "greek"
}
}
},
"content": {
"type": "string",
"fields": {
"greek": {
"type": "string",
"analyser": "greek"
}
}
},
"indexed_date": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
我使用 POST 因为我不太关心 _id,这样 ES 会为这个变量提供一个随机值,而不是使用 PUT 来指定它的值。我为标题和内容创建两个字段的原因是因为我希望拥有文本的原始版本和“停用词删除词干”版本,以便能够在找到与用户输入完全一致的术语时获得更高的权重它(而不是只存储词干的版本)
用数据填充索引后,例如:
PUT /test/text
{
"title": " ",
"content": " ",
"date": " "
}
我尝试过这样的搜索查询:
GET /test/text/_search
{
"query":{
"multi_match":{
"query":"όμορφος",
"type":"most_fields",
"fields":["content","content.greek","title","title.greek"]}}}
然后通过将查询更改为“όμορφη”,这些单词具有相同的词干版本,即“όμορφ”,因此由于 ES 的希腊语言分析器,我应该得到相同的条目,但我没有.
知道为什么吗?在索引文档时我应该做更多的事情吗?阅读文档后,我的印象是,在为一段文本建立索引时定义映射后,它会自动被双向索引,并且每次都会使用适当的分析器自动分析查询。
如果我的印象正确,为什么我的查询没有返回相同的结果?有什么想法吗?
提前谢谢你。
【问题讨论】:
标签: elasticsearch mapping analyzer