Elasticsearch 映射和设置定义
Elasticsearch Mapping and Settings definitions
我尝试通过配置其映射和设置来设置新索引。
这是我使用的代码:
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。我为标题和内容创建两个字段的原因是因为我希望拥有文本的原始版本和 'stop words removed-stemmed' 版本,以便在找到与用户输入的字词完全一致的情况下能够获得更高的权重(而不是仅存储单词的词干版本)
用数据填充索引后,例如:
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 的希腊语分析器,我应该得到相同的条目,但我没有't。
知道为什么吗?在索引我的文档时我应该做更多的事情吗?阅读文档后,我的印象是,在为一段文本建立索引时定义映射后,它会自动以两种方式建立索引,并且每次都会使用适当的分析器自动分析查询。
如果我的印象是正确的,为什么我的查询 return 没有相同的结果?有什么想法吗?
提前致谢。
要首先创建索引,您需要调用 PUT test
而不是 POST /test/text
。后者将简单地在名为 test
的新索引中创建类型为 text
的新文档,但具有默认设置和映射。
首先:
PUT /test
{
"settings": {
...
},
"mappings": {
...
}
}
然后您可以创建新文档(请注意,您的映射类型称为 article
,而不是 text
)
POST /test/article
{
"title": " ",
"content": " ",
"date": " "
}
那么只有您的搜索查询有效
我尝试通过配置其映射和设置来设置新索引。
这是我使用的代码:
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。我为标题和内容创建两个字段的原因是因为我希望拥有文本的原始版本和 'stop words removed-stemmed' 版本,以便在找到与用户输入的字词完全一致的情况下能够获得更高的权重(而不是仅存储单词的词干版本)
用数据填充索引后,例如:
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 的希腊语分析器,我应该得到相同的条目,但我没有't。
知道为什么吗?在索引我的文档时我应该做更多的事情吗?阅读文档后,我的印象是,在为一段文本建立索引时定义映射后,它会自动以两种方式建立索引,并且每次都会使用适当的分析器自动分析查询。
如果我的印象是正确的,为什么我的查询 return 没有相同的结果?有什么想法吗?
提前致谢。
要首先创建索引,您需要调用 PUT test
而不是 POST /test/text
。后者将简单地在名为 test
的新索引中创建类型为 text
的新文档,但具有默认设置和映射。
首先:
PUT /test
{
"settings": {
...
},
"mappings": {
...
}
}
然后您可以创建新文档(请注意,您的映射类型称为 article
,而不是 text
)
POST /test/article
{
"title": " ",
"content": " ",
"date": " "
}
那么只有您的搜索查询有效