我尝试使用Elasticsearch为我的内容实现A-Z导航。我需要的是显示所有以a,b,c等开头的结果。
我试过了:
"query": { "match_phrase_prefix" : { "title" : { "query" : "a" } } }
上面提到的查询还显示结果,其中字符串中的单词以a开头。例:
“ title”:“ Apfelpfannkuchen”,
“ title”:“ Affogato”,
“ title”:“ Kalbsschnitzel a n A ceto Balsamico”,
我只想显示第一个单词以a开头的短语。
这是我使用的映射:
$params = array( 'index' => 'my_index', 'body' => array( 'settings' => array( 'number_of_shards' => 1, 'index' => array( 'analysis' => array( 'filter' => array( 'nGram_filter' => array( 'type' => 'nGram', 'min_gram' => 2, 'max_gram' => 20, 'token_chars' => array('letter', 'digit', 'punctuation', 'symbol') ) ), 'analyzer' => array( 'nGram_analyzer' => array( 'type' => 'custom', 'tokenizer' => 'whitespace', 'filter' => array('lowercase', 'asciifolding', 'nGram_filter') ), 'whitespace_analyzer' => array( 'type' => 'custom', 'tokenizer' => 'whitespace', 'filter' => array('lowercase', 'asciifolding') ), 'analyzer_startswith' => array( 'tokenizer' => 'keyword', 'filter' => 'lowercase' ) ) ) ) ), 'mappings' => array( 'tags' => array( '_all' => array( 'type' => 'string', 'index_analyzer' => 'nGram_analyzer', 'search_analyzer' => 'whitespace_analyzer' ), 'properties' => array() ), 'posts' => array( '_all' => array( 'index_analyzer' => 'nGram_analyzer', 'search_analyzer' => 'whitespace_analyzer' ), 'properties' => array( 'title' => array( 'type' => 'string', 'index_analyzer' => 'analyzer_startswith', 'search_analyzer' => 'analyzer_startswith' ) ) ) ) ) );
如果您使用的是默认映射,那么它将不适用于您。
您需要在映射中使用关键字标记器和小写过滤器。
映射将是:
{ "settings": { "index": { "analysis": { "analyzer": { "analyzer_startswith": { "tokenizer": "keyword", "filter": "lowercase" } } } } }, "mappings": { "test_index": { "properties": { "title": { "search_analyzer": "analyzer_startswith", "index_analyzer": "analyzer_startswith", "type": "string" } } } } }
搜索查询test_index:
test_index
{ "query": { "match_phrase_prefix": { "title": { "query": "a" } } } }
它将返回所有以a
a