2014-10-29 55 views
0

我一直在使用弹性搜索项目,但我发现雪球分析仪的结果有点奇怪。Elasticsearch雪球分析仪需要精确的词

下面是我使用的Mapping的例子。

$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); 

在quering的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场为 “米兰”。在查询“米兰”时,我得到了期望的结果,但如果我查询“米兰”或“米尔”,我找不到结果。

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

我也试过在查询期间雪球分析仪,没有帮助。

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

第二个问题是关键字搜索是区分大小写的,例如Pizza!= pizza,我该如何摆脱这种困境?

感谢,

回答

1

snowball词干不想原话。如果使用jumping进行尝试,则按预期输出jump

但是,根据具体情况,您的单词可能会由于它与任何词干分析规则不匹配而处于不准确的状态。

如果使用analyze API端点(更多信息here),你会看到与snowball分析仪分析Milano给你令牌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 
     } 
    ] 
} 

这就是为什么搜索“米兰”或“万”不匹配“米兰”的文件:它不与存储在索引中的milano项。

关于第二个问题,你可以准备一个custom分析仪结合keyword标记生成器和lowercase tokenfilter才能有你的关键字搜索不区分大小写(如果您使用在搜索时相同的分析仪):

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 
     } 
    ] 
} 

我希望我的阐释足够清晰:)

+0

Thankyou为适当的答案,非常清楚,如果我想让它搜索任何字符,但不使用stemmer规则,应该使用什么分析器。正则表达式 ? – 2014-10-30 09:52:32

+0

也许[ngrams](http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_ngrams_for_partial_matching.html)将是正确的答案 – ThomasC 2014-10-30 09:58:09

+0

真的很感谢你花时间回答这样的问题。非常感谢你 – 2014-10-30 10:08:43