我一直在为项目使用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/