elasticsearch ngram analyzer / tokenizer无法正常工作?

时间:2014-06-18 15:59:30

标签: elasticsearch nest

似乎ngram tokenizer无法正常工作,或者我对它的理解/使用不正确。

我的标记器正在做一个3的mingram和5的maxgram。我正在寻找术语'madonna',这绝对是在artists.name下的文件中。我可以用其他技术(使用简单的分析器和相关技术)找到该术语,但不能使用ngram。

我想通过使用ngram来实现的目的是找到错误拼写的名称和会计。

请查看我的映射,设置和查询的缩短版本,如果您有任何想法,请告诉我 - 这让我疯了!

设置...

{
   "myindex": {
      "settings": {
         "index": {
            "analysis": {
               "analyzer": {                  
                  "ngramAnalyzer": {
                     "type": "custom",
                     "filter": [
                        "lowercase"
                     ],
                     "tokenizer": "nGramTokenizer"
                  }  
               },
               "tokenizer": {
                  "nGramTokenizer": {
                     "type": "nGram",
                     "min_gram": "3",
                     "max_gram": "5"
                  }
               }
            },
            "number_of_shards": "5",
            "number_of_replicas": "1",
            "version": {
               "created": "1020199"
            },
            "uuid": "60ggSr6TREaDTItkaNUagg"
         }
      }
   }
}

映射......

{
   "myindex": {
      "mappings": {
         "mytype": {
            "properties": { 
               "artists.name": {
                  "type": "string",
                  "analyzer": "simple",
                  "fields": {
                     "ngram": {
                        "type": "string",
                        "analyzer": "ngramAnalyzer"
                     },
                     "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                     }
                  }
               }
            }
         }
      }
   }
}

查询...

{"query": {"match": {"artists.name.ngram": "madonna"}}}

文件......

{
   "_index": "myindex",
   "_type": "mytype",
   "_id": "602537592951",
   "_version": 1,
   "found": true,
   "_source": {
      "artists": [
         {
            "name": "Madonna",
            "id": "P    64565"
         }
      ]
   }
}

修改 顺便说一下,这个查询有效(没有ngram):

{"query": {"match": {"artists.name": "madonna"}}}

这显然与嵌套对象有关。我显然没有正确地将ngram应用于嵌套对象。

想法?

1 个答案:

答案 0 :(得分:4)

好的 - 我明白了。我真的希望这可以帮助某人,因为它让我疯狂。

这是我的映射结果如下:

{
   "myindex": {
      "mappings": {
         "mytype": {
            "properties": {               
               "artists": {
                  "properties": {
                     "id": {
                        "type": "string"
                     },
                     "name": {
                        "type": "string",
                        "analyzer": "ngramAnalyzer",
                        "fields": {
                           "raw": {
                              "type": "string",
                              "index": "not_analyzed"
                           }
                        }
                     }
                  }
               }
            }
        }
    }
}

以及我如何使用Nest语法...

首先我有一个名为Person的子类型(类),其名称和ID看起来像这样(POCO)......

[Serializable]
public class Person
{
    public string Name { get; set; }
    [ElasticProperty(Analyzer = "fullTerm", Index = FieldIndexOption.not_analyzed)]
    public string Id { get; set; }
}

然后我的映射就像这样......

.AddMapping<MyIndex>(m => m
.MapFromAttributes()
.Properties(props =>
{
    props           
        .Object<Person>(x => x.Name("artists")
        .Properties(pp => pp
            .MultiField(
                mf => mf
                .Name(s => s.Name)
                .Fields(f => f
                    .String(s => s.Name(o => o.Name).Analyzer("ngramAnalyzer"))
                    .String(s => s.Name(o => o.Name.Suffix("raw")).Index(FieldIndexOption.not_analyzed))
                )
            )
        )
    )
)

注意:此处的对象表示它是我的类型&#39;艺术家&#39;之后的另一个对象。

谢谢,我!!!