【发布时间】:2011-09-21 23:07:30
【问题描述】:
我最近开始使用 ElasticSearch,但我似乎无法让它搜索单词的一部分。
示例:我在 ElasticSearch 中索引了我的 couchdb 中的三个文档:
{
"_id" : "1",
"name" : "John Doeman",
"function" : "Janitor"
}
{
"_id" : "2",
"name" : "Jane Doewoman",
"function" : "Teacher"
}
{
"_id" : "3",
"name" : "Jimmy Jackal",
"function" : "Student"
}
所以现在,我要搜索所有包含“Doe”的文档
curl http://localhost:9200/my_idx/my_type/_search?q=Doe
这不会返回任何命中。但是如果我搜索
curl http://localhost:9200/my_idx/my_type/_search?q=Doeman
它确实返回一个文档(John Doeman)。
我尝试将不同的分析器和不同的过滤器设置为我的索引的属性。我也尝试过使用完整的查询(例如:
{
"query": {
"term": {
"name": "Doe"
}
}
}
) 但似乎没有任何效果。
当我搜索“Doe”时,如何让 ElasticSearch 同时找到 John Doeman 和 Jane Doewoman?
更新
我尝试使用 nGram 标记器和过滤器,就像 Igor 建议的那样,像这样:
{
"index": {
"index": "my_idx",
"type": "my_type",
"bulk_size": "100",
"bulk_timeout": "10ms",
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "my_ngram_tokenizer",
"filter": [
"my_ngram_filter"
]
}
},
"filter": {
"my_ngram_filter": {
"type": "nGram",
"min_gram": 1,
"max_gram": 1
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "nGram",
"min_gram": 1,
"max_gram": 1
}
}
}
}
}
我现在遇到的问题是每个查询都返回所有文档。 任何指针?关于使用 nGram 的 ElasticSearch 文档不是很好...
【问题讨论】:
-
难怪,你将 min/max ngram 设置为 1,所以 1 个字母 :)
-
我真的很惊讶 ES 并没有让这变得更容易。它是 ElasticSearch,而不是 ElasticExactMatchUnlessIDoSomeCeremony
标签: elasticsearch