我最近开始使用ElasticSearch,但似乎无法让它搜索单词的一部分。
示例:我有我的ouchdb中的三个文档,在ElasticSearch中建立了索引:
{ "_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文档不是很好…
我也在使用nGram。我将标准标记器和nGram用作过滤器。这是我的设置:
{ "index": { "index": "my_idx", "type": "my_type", "analysis": { "index_analyzer": { "my_index_analyzer": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "mynGram" ] } }, "search_analyzer": { "my_search_analyzer": { "type": "custom", "tokenizer": "standard", "filter": [ "standard", "lowercase", "mynGram" ] } }, "filter": { "mynGram": { "type": "nGram", "min_gram": 2, "max_gram": 50 } } } } }
让我们找到最多50个字母的单词部分。根据需要调整max_gram。用德语来说可以变得很大,所以我将其设置为很高的值。