Elasticsearch Snowball Analyzer需要准确的单词

时间:2014-10-29 12:31:41

标签: php elasticsearch

我一直在使用Elastic Search进行项目,但我发现Snowball Analyzer的结果有点奇怪。

以下是我使用的映射示例。

$myTypeMapping = array(
    '_source' => array(
        'enabled' => true
    ),
    'properties' => array(
        'id'    => array(
            'type'  => 'integer',
            'index' => 'not_analyzed'
        ),
        'name' => array(
            'type' => 'string',
            'analyzer' => 'snowball',
            'boost' => 2.0
        ),
        'food_types' => array(
            'type' => 'string',
            'analyzer' => 'keyword'
        ),
        'location' => array(
            'type' => 'geo_point',
            "geohash_precision"=> 4
        ),
        'city' => array(
            'type' => 'string',
            'analyzer' => 'keyword'
        )
    )
);
$indexParams['body']['mappings']['online_pizza'] = $myTypeMapping;

// Create the index

$elastic_client->indices()->create($indexParams);

在查询http://localhost:9200/online_pizza/online_pizza/_mapping时,我得到以下结果,

    {
  "online_pizza": {
    "properties": {
      "city": {
        "type": "string",
        "analyzer": "keyword"
      },
      "food_types": {
        "type": "string",
        "analyzer": "keyword"
      },
      "id": {
        "type": "integer"
      },
      "location": {
        "type": "geo_point",
        "geohash_precision": 4
      },
      "name": {
        "type": "string",
        "boost": 2,
        "analyzer": "snowball"
      }
    }
  }
}

我的问题是,我有数据,其中Name字段为“Milano”。在询问“米兰”时,我得到了理想的结果,但如果我查询“米兰”或“米尔”,我就没有找到结果。

 {
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "Milan"
     }
   }
 }

在查询过程中我也尝试过雪球分析器,没有帮助。

{
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "Milan",
      "analyzer": "snowball"
    }
  }
}

第二个问题是关键字搜索区分大小写,例如,披萨!=披萨,我该如何逃避?

谢谢,

1 个答案:

答案 0 :(得分:1)

snowball词干分析师并不需要准确的词汇。如果您使用jumping进行试用,则会按预期输出jump

但是,根据具体情况,您的单词可能会被忽略,因为它与任何词干分析规则都不匹配。

如果您使用analyze API端点(更多信息here),您会看到使用Milano分析器分析snowball会为您提供令牌milano

GET _analyze?analyzer=snowball&text=Milano

输出:

{
   "tokens": [
      {
         "token": "milano",
         "start_offset": 0,
         "end_offset": 6,
         "type": "<ALPHANUM>",
         "position": 1
      }
   ]
}

然后,在Mil上使用相同的雪球分析器:

GET _analyze?analyzer=snowball&text=Mil

给你这个标记:

{
   "tokens": [
      {
         "token": "mil",
         "start_offset": 0,
         "end_offset": 3,
         "type": "<ALPHANUM>",
         "position": 1
      }
   ]
}

这就是为什么要搜索米兰&#39;或者&#39; mil&#39;赢得了不匹配的米兰&#39;文档:它与索引中存储的milano术语不匹配。

对于第二个问题,您可以准备一个custom分析器,其中包含keyword标记器和lowercase标记过滤器,以使您的关键字搜索不区分大小写(如果您使用相同的分析器)在搜索时间):

POST index_name
{
  "analysis": {
   "analyzer": {
     "case_insensitive_keyword": {
       "type": "custom",
       "tokenizer": "keyword",
       "filter": ["lowercase"]
     }
   }
  }
}

测试:

GET analyse/_analyze?analyzer=case_insensitive_keyword&text=Choo Choo

输出:

{
   "tokens": [
      {
         "token": "choo choo",
         "start_offset": 0,
         "end_offset": 9,
         "type": "word",
         "position": 1
      }
   ]
}

我希望我的解释清楚得多:)