关于elasticsearch的新手问题。我已经设置了elasticsearch lucene索引并使用搜索包含某些术语的名称,例如
search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':"JUST"}}})
这不会给我起名字" JUSTIN"但以下查询
search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':"JUSTIN"}}})
我做错了什么?不应该"匹配"查询返回包含该术语的记录? 感谢。
答案 0 :(得分:0)
处理这种需求的最佳方法是创建一个使用edgeNGram token filter的自定义分析器。忘记通配符并在查询字符串中使用*
,这些都表现不及edgeNGram方法。
因此,您必须首先创建这样的索引,然后将数据重新索引到其中。
curl -XPUT http://localhost:9200/sample -d '{
"settings": {
"analysis": {
"filter": {
"prefixes": {
"type": "edgeNGram",
"min_gram": 1,
"max_gram": 15
}
},
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "prefixes"]
}
}
}
},
"mappings": {
"your_type": {
"properties": {
"first_name": {
"type": "string",
"analyzer": "my_analyzer",
"search_analyzer": "standard"
}
}
}
}
}'
然后,在为first_name: JUSTIN
建立索引时,您将获得以下索引标记:j
,ju
,jus
,just
,justi
,justin
,基本上是JUSTIN的所有前缀。
然后,您就可以使用第二个查询进行搜索,并实际找到您的期望。
search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':'JUST'}}})