我一直在使用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"
}
}
}
第二个问题是关键字搜索区分大小写,例如,披萨!=披萨,我该如何逃避?
谢谢,
答案 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
}
]
}
我希望我的解释清楚得多:)