如何使用ElasticSearch搜索单词的一部分

我最近开始使用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。用德语来说可以变得很大,所以我将其设置为很高的值。

以上是 如何使用ElasticSearch搜索单词的一部分 的全部内容, 来源链接: utcz.com/qa/411589.html

回到顶部