我一直在玩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
)。
我也尝试更改配置文件,以便default_search也使用ngram令牌过滤器,但结果是相同的。我在这里做错了什么,如何纠正?
答案 0 :(得分:10)
不确定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
答案 1 :(得分:1)
您应该检查获取映射API以查看您的映射是否已应用: http://www.elasticsearch.org/guide/reference/api/admin-indices-get-mapping.html
顺便说一下,在邮件列表中已经说过,当一个索引已经包含文档时,你在elasticsearch.yml上的映射就不会被应用了。您需要先清理索引。
我已经尝试了ES的ngrams,它对我来说很好。