如何关闭 easticsearch match_phrase 或 match_phrase_prefix 的自动完成功能?
How to turn off autocomplete for easticsearch match_phrase or match_phrase_prefix?
我有 ES 数据,其中包含类型 text
的字段 name
。我必须按小写输入进行搜索,而实际名称可能使用大小写符号。我只需要准确的(但不区分大小写)名称。
我尝试使用 match_phrase
(以及 match_phrase_prefix
)。但它 returns 结果是自动完成的。点赞查询
"match_phrase": {
"name": {
"query": "apple iphone 11"
}
}
returns两项:
{
"id": "547",
"name": "Apple iPhone 11",
}
和
{
"id": "253",
"name": "Apple iPhone 11 Pro",
}
我只需要带有 id: 547
的那个,即名称中没有多余符号的地方。
Elastcsearch 是否有工具来查找准确的名称,但以不区分大小写的形式且没有自动完成功能?
Does Elastcsearch have tools to find the exact name?
是的,Elasticsearch 为精确搜索提供了“关键词”类型。
in a case insensitive form and without autocomplete?
您可以使用带有小写过滤器的normalizer
- 在索引设置中添加规范器
PUT /so_index/
{
"settings":{
"analysis":{
"normalizer":{
"name_normalizer":{
"type":"custom",
"filter":[
"lowercase"
]
}
}
}
}
}
- 映射(您可以将名称用作精确匹配的关键字,也可以同时使用关键字和文本进行精确搜索和全文搜索)
PUT /so_index/_mapping
{
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"normalizer": "name_normalizer"
}
}
}
}
}
- 使用匹配或字词查询
获取/so_index/_search
{
"query": {
"match": {
"name.keyword": "apple iphone 11"
}
}
}
我通过一个简单的脚本实现了我的需求:
"filter": [
{
"script": {
"script": {
"source": "doc[params.nameField].value != null && doc[params.nameField].value.equalsIgnoreCase(params.name)",
"lang": "painless",
"params": {
"name": "apple iphone 11",
"nameField": "name.exact"
}
},
"boost": 1.0
}
}
]
我有 ES 数据,其中包含类型 text
的字段 name
。我必须按小写输入进行搜索,而实际名称可能使用大小写符号。我只需要准确的(但不区分大小写)名称。
我尝试使用 match_phrase
(以及 match_phrase_prefix
)。但它 returns 结果是自动完成的。点赞查询
"match_phrase": {
"name": {
"query": "apple iphone 11"
}
}
returns两项:
{
"id": "547",
"name": "Apple iPhone 11",
}
和
{
"id": "253",
"name": "Apple iPhone 11 Pro",
}
我只需要带有 id: 547
的那个,即名称中没有多余符号的地方。
Elastcsearch 是否有工具来查找准确的名称,但以不区分大小写的形式且没有自动完成功能?
Does Elastcsearch have tools to find the exact name?
是的,Elasticsearch 为精确搜索提供了“关键词”类型。
in a case insensitive form and without autocomplete?
您可以使用带有小写过滤器的normalizer
- 在索引设置中添加规范器
PUT /so_index/
{
"settings":{
"analysis":{
"normalizer":{
"name_normalizer":{
"type":"custom",
"filter":[
"lowercase"
]
}
}
}
}
}
- 映射(您可以将名称用作精确匹配的关键字,也可以同时使用关键字和文本进行精确搜索和全文搜索)
PUT /so_index/_mapping
{
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"normalizer": "name_normalizer"
}
}
}
}
}
- 使用匹配或字词查询
获取/so_index/_search
{
"query": {
"match": {
"name.keyword": "apple iphone 11"
}
}
}
我通过一个简单的脚本实现了我的需求:
"filter": [
{
"script": {
"script": {
"source": "doc[params.nameField].value != null && doc[params.nameField].value.equalsIgnoreCase(params.name)",
"lang": "painless",
"params": {
"name": "apple iphone 11",
"nameField": "name.exact"
}
},
"boost": 1.0
}
}
]