我一直在为项目使用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”。查询“Milano”时,我得到了期望的结果,但是如果查询“Milan”或“Mil”,则没有找到结果。
 {
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "Milan"
     }
   }
 }

我也曾尝试在查询过程中使用分析器,没有帮助。
{
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "Milan",
      "analyzer": "snowball"
    }
  }
}

第二个问题是关键字搜索区分大小写,例如Pizza!= pizza,我如何解决这个问题?

谢谢,

最佳答案

snowball词干查询器不需要确切的单词。如果您使用jumping尝试,它将按预期输出jump

但是,视情况而定,您的单词可能不正确,因为它不符合任何词干法则。

如果使用analyze API端点(更多信息here),您将看到使用Milano分析器分析snowball会得到 token 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

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

这就是为什么搜索“milan”或“mil”与“Milano”文档不匹配的原因:它与存储在索引中的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
      }
   ]
}

我希望我的解释足够清楚:)

关于php - Elasticsearch Snowball Analyzer想要确切的词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26630437/

10-11 09:17