我一直在与ElasticSearch一起玩我的一个新项目。我已将默认分析器设置为使用ngram tokenfilter。这是我的elasticsearch.yml文件:
index: analysis: analyzer: default_index: tokenizer: standard filter: [standard, stop, mynGram] default_search: tokenizer: standard filter: [standard, stop] filter: mynGram: type: nGram min_gram: 1 max_gram: 10
我创建了一个新索引并向其中添加了以下文档:
$ curl -XPUT http://localhost:9200/test/newtype/3 -d '{"text": "one two three four five six"}' {"ok":true,"_index":"test","_type":"newtype","_id":"3"}
但是,当我使用查询text:hree或text:ive任何其他部分术语进行搜索时,ElasticSearch不会返回此文档。仅当我搜索确切的字词(如text:two)时,它才会返回文档。
text:hree
text:ive
text:two
我还尝试过更改配置文件,以便default_search也使用ngram令牌过滤器,但结果是相同的。我在这里做错什么,如何纠正?
不确定default_ *设置。但是应用指定index_analyzer和search_analyzer的映射有效:
curl -XDELETE localhost:9200/twitter curl -XPOST localhost:9200/twitter -d ' {"index": { "number_of_shards": 1, "analysis": { "filter": { "mynGram" : {"type": "nGram", "min_gram": 2, "max_gram": 10} }, "analyzer": { "a1" : { "type":"custom", "tokenizer": "standard", "filter": ["lowercase", "mynGram"] } } } } } }' curl -XPUT localhost:9200/twitter/tweet/_mapping -d '{ "tweet" : { "index_analyzer" : "a1", "search_analyzer" : "standard", "date_formats" : ["yyyy-MM-dd", "dd-MM-yyyy"], "properties" : { "user": {"type":"string", "analyzer":"standard"}, "message" : {"type" : "string" } } }}' curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elastic Search" }' curl -XGET localhost:9200/twitter/_search?q=ear curl -XGET localhost:9200/twitter/_search?q=sea curl -XGET localhost:9200/twitter/_mapping