您走在正确的道路上,但是,您还需要添加另一个利用
edge-ngram令牌过滤器的分析器,以使“开头为”约束开始工作。您可以保留
ngram用于“包含”给定单词的用于检查的字段,但是您需要
edge-ngram检查用于“以”某些标记“开头”的字段。
PUT /sample{ "settings": { "index.number_of_shards": 5, "index.number_of_replicas": 0, "analysis": { "filter": { "nGram_filter": { "type": "nGram", "min_gram": 2, "max_gram": 20, "token_chars": [ "letter", "digit" ] }, "edgenGram_filter": { "type": "edgeNGram", "min_gram": 2, "max_gram": 20 } }, "analyzer": { "ngram_index_analyzer": { "type": "custom", "tokenizer": "keyword", "filter": [ "lowercase", "nGram_filter" ] }, "edge_ngram_index_analyzer": { "type": "custom", "tokenizer": "keyword", "filter": [ "lowercase", "edgenGram_filter" ] } } } }, "mappings": { "test": { "properties": { "name": { "type": "string", "fields": { "prefixes": { "type": "string", "analyzer": "edge_ngram_index_analyzer", "search_analyzer": "standard" }, "substrings": { "type": "string", "analyzer": "ngram_index_analyzer", "search_analyzer": "standard" } } } } } }}然后您的查询将变为(即搜索其
name字段包含
play或以开头的所有文档
magazine)
POST /sample/test/_search{ "query": { "bool": { "minimum_should_match": 1, "should": [ {"match": { "name.substrings": "play" }}, {"match": { "name.prefixes": "magazine" }} ] } }}注意:请勿
wildcard用于搜索子字符串,因为它会破坏群集的性能(此处和此处提供更多信息)



