多个分析仪到特定领域

时间:2018-11-08 16:34:56

标签: elasticsearch

我正在研究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

       }

            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

无法找到您想要的东西。 您不能在一个字段上拥有多个分析器。

并查看您的需求,您可以简单地添加两个过滤器(停止过滤器和滚雪球过滤器),并按Solution 1部分所示进行添加。我还提到了另外两种方法,仅供您参考,但是我认为它们对您的用例没有多大意义。

解决方案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
    }
  ]
}

解决方案2:使用多字段

但是,如果您真的坚持要拥有多个分析器,则可以使用创建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

解决方案3:多个索引,相同的别名

为此,您最终将拥有

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_index1some_index2

POST some_index/_search
{
  "query": {
    "match": {
      "title": "perfection"
    }
  }
}

希望有帮助!