Elasticsearch:查找子串匹配

我想要执行确切的单词匹配和部分单词/子串匹配。 例如,如果我search“男士razor”,那么我应该能够在结果中find“男士razor”。 但是,如果我search“en的razor”,那么我也应该能够find“男士razor”的结果。 我使用以下设置和映射:

索引设置:

PUT /my_index { "settings": { "number_of_shards": 1, "analysis": { "filter": { "autocomplete_filter": { "type": "edge_ngram", "min_gram": 1, "max_gram": 20 } }, "analyzer": { "autocomplete": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "autocomplete_filter" ] } } } } } 

映射:

 PUT /my_index/my_type/_mapping { "my_type": { "properties": { "name": { "type": "string", "index_analyzer": "autocomplete", "search_analyzer": "standard" } } } } 

插入logging:

 POST /my_index/my_type/_bulk { "index": { "_id": 1 }} { "name": "men's shaver" } { "index": { "_id": 2 }} { "name": "women's shaver" } 

查询:

1.通过精确的词组匹配 – >“男性”

 POST /my_index/my_type/_search { "query": { "match": { "name": "men's" } } } 

以上查询返回返回结果中的“男士razor”。

2.通过部分词匹配 – >“EN的”

 POST /my_index/my_type/_search { "query": { "match": { "name": "en's" } } } 

上面的查询不会返回任何东西。

我也试过下面的查询

 POST /my_index/my_type/_search { "query": { "wildcard": { "name": { "value": "%en's%" } } } } 

还没有得到任何东西。 我认为这是因为索引上的“edge_ngram”typesfilter无法find“部分词/ sbustring匹配”。 我也尝试过“n-gram”types的filter,但是它会减慢search速度。

请build议我如何使用相同的索引设置来实现excact词组匹配和部分词组匹配。

要search部分字段匹配和完全匹配,如果将字段定义为“未分析”或关键字(而不是文本),则使用通配符查询会更好。

另见这个 。

要使用通配符查询,请在要search的string的两端追加*

 POST /my_index/my_type/_search { "query": { "wildcard": { "name": { "value": "*en's*" } } } } 

要使用不区分大小写 ,请使用带有小写筛选器和关键字标记器的自定义分析器。

定制分析仪:

 "custom_analyzer": { "tokenizer": "keyword", "filter": ["lowercase"] } 

使searchstring小写

如果你得到searchstringasd :改为* asd *

通过search任何string或子string使用:

 query: { or: [{ match_phrase_prefix: { name: str } }, { match_phrase_prefix: { surname: str } }] } 

快乐的编码与弹性search….