我正在研究Elastic Search 6.4.2。我需要将多个分析器应用于一个字段。我希望将雪球和停用词分析器应用于标题和内容字段。 Iam共享我的映射这是定义分析器的正确方法。
PUT /some-index
{
"settings": {
"index": {
"number_of_shards": 5,
"number_of_replicas": 1,
"refresh_interval": "60s",
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "my_snow"]
},
"stop_analyzer": {
"type": "stop",
"stopwords": "_english_"
}
} ,
"filter" : {
"my_snow" : {
"type" : "snowball",
"language" : "Lovins"
}
}
}
}
},
"mappings": {
"doc": {
"_source": {
"enabled": true
},
"properties": {
"content": {
"type": "text",
"index": "true",
"store": true,
"analyzer":["my_analyzer","stop_analyzer"],
"search_analyzer": ["my_analyzer","stop_analyzer"]
},
"title": {
"type": "text",
"index": "true",
"store": true,
"analyzer":["my_analyzer","stop_analyzer"],
"search_analyzer": ["my_analyzer","stop_analyzer"]
},
"url": {
"type": "text",
"index": "true",
"store": true
}
}
}
}
}
答案 0 :(得分:2)
无法找到您想要的东西。 您不能在一个字段上拥有多个分析器。
并查看您的需求,您可以简单地添加两个过滤器(停止过滤器和滚雪球过滤器),并按Solution 1
部分所示进行添加。我还提到了另外两种方法,仅供您参考,但是我认为它们对您的用例没有多大意义。
映射
PUT <your_index_name>
{
"settings": {
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "my_snow", "my_stop"]
}
},
"filter" : {
"my_snow" : {
"type" : "snowball",
"language": "English"
},
"my_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
},
"mappings": {
"doc": {
"_source": {
"enabled": true
},
"properties": {
"title": {
"type": "text",
"index": "true",
"store": true,
"analyzer": "my_analyzer"
}
}
}
}
}
样本分析查询
POST <your_index_name>/_analyze
{
"analyzer": "my_analyzer",
"text": "This is the thing, perfection is not worth it"
}
查询响应
{
"tokens": [
{
"token": "thing",
"start_offset": 12,
"end_offset": 17,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "perfect",
"start_offset": 19,
"end_offset": 29,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "worth",
"start_offset": 37,
"end_offset": 42,
"type": "<ALPHANUM>",
"position": 7
}
]
}
但是,如果您真的坚持要拥有多个分析器,则可以使用创建multi-field并使它们都使用单独的分析器。
下面是这种情况下的映射。我仅在title
字段中使用以下示例,您可以将更改应用于其他字段。请注意,下面的映射仅用于演示,建议您使用solution 1
。
PUT <your_index_name>
{
"settings":{
//same as the one you've posted in the question.
},
"mappings":{
"doc":{
"_source":{
"enabled":true
},
"properties":{
"title":{
"type":"text",
"index":"true",
"store":true,
"analyzer":"my_analyzer",
"fields":{
"withstopwords":{
"type":"text",
"analyzer":"stop_analyzer"
}
}
}
}
}
}
}
请注意,您需要确保在查询时使用正确的字段名称。
基本上将字段title
用于my_analyzer
,并将title.stopwords
用于stop_analyzer
。
为此,您最终将拥有
some_index1:analyzer_type_1
some_index2:analyzer_type_2
Add alias "some_index" for both some_index1 & some_index2
Query using this alias "some_index"
然后您可以使用别名进行查询,如下所示。请注意,当您使用some_index
查询时,最终将在内部搜索两个索引some_index1
和some_index2
。
POST some_index/_search
{
"query": {
"match": {
"title": "perfection"
}
}
}
希望有帮助!