gpt4 book ai didi

search - 在 not_analyzed 字段上进行 Elasticsearch 通配符搜索

转载 作者:行者123 更新时间:2023-11-29 02:46:58 25 4
gpt4 key购买 nike

我有一个索引,如以下设置和映射;

{
"settings":{
"index":{
"analysis":{
"analyzer":{
"analyzer_keyword":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
}
}
},
"mappings":{
"product":{
"properties":{
"name":{
"analyzer":"analyzer_keyword",
"type":"string",
"index": "not_analyzed"
}
}
}
}
}

我正努力在 name 字段上实现通配符搜索。我的示例数据是这样的;

[
{"name": "SVF-123"},
{"name": "SVF-234"}
]

当我执行以下查询时;

http://localhost:9200/my_index/product/_search -d '
{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"query": "*SVF-1*"
}
}
}

}
}'

它返回 SVF-123,SVF-234。我认为,它仍然标记数据。它必须只返回 SVF-123

你能帮忙解决一下吗?

提前致谢

最佳答案

这里有一些问题。

首先,您是说您不希望术语分析索引时间。然后,配置了一个分析器(使用搜索时间)生成不兼容的术语。 (它们是小写的)

默认情况下,所有术语都在标准分析器的 _all 字段中结束。那就是您最终要搜索的地方。由于它在“-”上标记化,您最终得到“*SVF”和“1*”的 OR。

尝试在 _all 和 name 上做一个术语方面,看看发生了什么。

这是一个可运行的 Play 和要点:https://www.found.no/play/gist/3e5fcb1b4c41cfc20226 ( https://gist.github.com/alexbrasetvik/3e5fcb1b4c41cfc20226 )

您需要确保索引的术语与您搜索的内容兼容。您可能想要禁用 _all,因为它会使正在发生的事情变得困惑。

#!/bin/bash

export ELASTICSEARCH_ENDPOINT="http://localhost:9200"

# Create indexes

curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{
"settings": {
"analysis": {
"text": [
"SVF-123",
"SVF-234"
],
"analyzer": {
"analyzer_keyword": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"type": {
"properties": {
"name": {
"type": "string",
"index": "not_analyzed",
"analyzer": "analyzer_keyword"
}
}
}
}
}'


# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"name":"SVF-123"}
{"index":{"_index":"play","_type":"type"}}
{"name":"SVF-234"}
'

# Do searches

# See all the generated terms.
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"facets": {
"name": {
"terms": {
"field": "name"
}
},
"_all": {
"terms": {
"field": "_all"
}
}
}
}
'

# Analyzed, so no match
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"query": {
"match": {
"name": {
"query": "SVF-123"
}
}
}
}
'

# Not analyzed according to `analyzer_keyword`, so matches. (Note: term, not match)
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"query": {
"term": {
"name": {
"value": "SVF-123"
}
}
}
}
'


curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"query": {
"term": {
"_all": {
"value": "svf"
}
}
}
}
'

关于search - 在 not_analyzed 字段上进行 Elasticsearch 通配符搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21161062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com