Elasticsearch "starts with" 短语中的第一个单词
Elasticsearch "starts with" first word in phrases
我尝试使用 Elasticsearch 为我的内容实现 A-Z 导航。
我需要的是显示以例如开头的所有结果。 a,b,c,...等等
我试过:
"query": {
"match_phrase_prefix" : {
"title" : {
"query" : "a"
}
}
}
上面提到的查询也显示结果,其中字符串中的单词以 a 开头。
示例:
"title": "Apfelpfannkuchen",
"title": "Affogato",
"title": "Kalbsschnitzel an Aceto 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'
)
)
)
)
)
);
如果您使用的是默认映射,则它不适合您。
您需要在映射中使用keyword tokenizer and lowercase filter。
映射将是:
{
"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
上的搜索查询:
{
"query": {
"match_phrase_prefix": {
"title": {
"query": "a"
}
}
}
}
它将 return 所有 post 以 a
开头的标题
我正在根据 this gist 更新@Roopendra 的回答。因此,有一个更新,在最近的版本中 search
和 index
初始化程序似乎不起作用,仅替换为 initializers
,string
也需要替换为 text
.
因此,我们有以下映射文件:
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"analyzer_startswith": {
"tokenizer": "keyword",
"filter": "lowercase"
}
}
}
}
},
"mappings": {
"test_index": {
"properties": {
"title": {
"analyzer": "analyzer_startswith",
"type": "text"
}
}
}
}
}
使用以下查询:
{
"query": {
"match_phrase_prefix": {
"title": {
"query": "a",
"max_expansions": 100
}
}
}
}
我在查询中添加了 max_expansions
因为默认值似乎是 5
所以我得到了错误的结果,在你的情况下这个值可能更高。
或者,可以使用 span_near
:
GET your_index/_search
{
"query": {
"span_first": {
"match": {
"span_term": {
"your_field": "first_token"
}
},
"end": 1
}
},
"_source": "your_field"
}
我尝试使用 Elasticsearch 为我的内容实现 A-Z 导航。 我需要的是显示以例如开头的所有结果。 a,b,c,...等等
我试过:
"query": {
"match_phrase_prefix" : {
"title" : {
"query" : "a"
}
}
}
上面提到的查询也显示结果,其中字符串中的单词以 a 开头。 示例:
"title": "Apfelpfannkuchen",
"title": "Affogato",
"title": "Kalbsschnitzel an Aceto 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'
)
)
)
)
)
);
如果您使用的是默认映射,则它不适合您。
您需要在映射中使用keyword tokenizer and lowercase filter。
映射将是:
{
"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
上的搜索查询:
{
"query": {
"match_phrase_prefix": {
"title": {
"query": "a"
}
}
}
}
它将 return 所有 post 以 a
我正在根据 this gist 更新@Roopendra 的回答。因此,有一个更新,在最近的版本中 search
和 index
初始化程序似乎不起作用,仅替换为 initializers
,string
也需要替换为 text
.
因此,我们有以下映射文件:
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"analyzer_startswith": {
"tokenizer": "keyword",
"filter": "lowercase"
}
}
}
}
},
"mappings": {
"test_index": {
"properties": {
"title": {
"analyzer": "analyzer_startswith",
"type": "text"
}
}
}
}
}
使用以下查询:
{
"query": {
"match_phrase_prefix": {
"title": {
"query": "a",
"max_expansions": 100
}
}
}
}
我在查询中添加了 max_expansions
因为默认值似乎是 5
所以我得到了错误的结果,在你的情况下这个值可能更高。
或者,可以使用 span_near
:
GET your_index/_search
{
"query": {
"span_first": {
"match": {
"span_term": {
"your_field": "first_token"
}
},
"end": 1
}
},
"_source": "your_field"
}