当前位置: 首页 > 面试题库 >

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

姚钊
2023-03-14
问题内容

我有一个类似以下设置和映射的索引;

{
  "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-123SVF-234。我认为,它仍然标记数据。它只能返回SVF-123

您能帮上忙吗?

提前致谢


问题答案:

我的解决方案历险记

如您在我的问题中所见,我已经开始审理案件。每当我更改了一部分设置后,一部分便开始工作,而另一部分则停止工作。让我给出我的解决方案历史记录:

1.) 我已将数据索引为默认值。这意味着,我的数据是analyzed默认的。这将在我这方面引起问题。例如;

当用户开始搜索诸如 SVF-1 的关键字时,系统将运行以下查询:

{
    "query": {
        "filtered" : {
            "query" : {
                "query_string" : {
                    "analyze_wildcard": true,
                    "query": "*SVF-1*"
                }
            }
        }

    }
}

和结果;

SVF-123
SVF-234

这是正常现象,因为name我的文档字段是analyzed。这将查询分为记号SVF1,并SVF与我的文档匹配,尽管1不匹配。我已经跳过了。我为我的字段创建了一个映射not_analyzed

{
  "mappings":{
     "product":{
        "properties":{
           "name":{
              "type":"string",
              "index": "not_analyzed"
           },
           "site":{
              "type":"string",
              "index": "not_analyzed"
           } 
        }
     }
  }
}

但我的问题仍然存在。

2.)
经过大量研究,我想尝试另一种方法。决定使用通配符查询。我的查询是

{
    "query": {
        "wildcard" : {
            "name" : {
                "value" : *SVF-1*"
             }
          }
      },
            "filter":{
                    "term": {"site":"pro_en_GB"}
            }
    }
}

该查询有效,但是这里有一个问题。我的字段不再进行分析,我正在进行通配符查询。区分大小写是这里的问题。如果我像 svf-1
一样搜索,它什么也不会返回。因为,用户可以输入小写版本的查询。

3.) 我将文档结构更改为;

{
  "mappings":{
     "product":{
        "properties":{
           "name":{
              "type":"string",
              "index": "not_analyzed"
           },
           "nameLowerCase":{
              "type":"string",
              "index": "not_analyzed"
           }
           "site":{
              "type":"string",
              "index": "not_analyzed"
           } 
        }
     }
  }
}

我还增加了一个name名为的字段nameLowerCase索引文档时,我将文档设置为:

{
    name: "SVF-123",
    nameLowerCase: "svf-123",
    site: "pro_en_GB"
}

在这里,我将查询关键字转换为小写并在新nameLowerCase索引上进行搜索操作。并显示name字段。

我查询的最终版本是;

{
    "query": {
        "wildcard" : {
            "nameLowerCase" : {
                "value" : "*svf-1*"
             }
          }
      },
            "filter":{
                    "term": {"site":"pro_en_GB"}
            }
    }
}

现在可以了。还有一种使用multi_field解决此问题的方法。我的查询包含破折号(-),并且遇到了一些问题。

非常感谢@Alex Brasetvik的详细解释和努力



 类似资料:
  • 我确实在ElasticSearch中的字段中有一个数组数据,其中有一个关键字类型。我想用我想搜索的独占值搜索这个数组,即排除不包括在我的搜索关键字中的数组值。请看下面的细节。 谢了! 我有以下弹性搜索索引映射: 使用以下示例数据: 我的搜索是这样的: 我用过MatchQueryBuilder、TermQueryBuilder、TermsQueryBuilder都没用。根据ElasticSearch

  • 问题内容: 我已经使用此批量请求设法用4个文档填充了索引: 开机自检 现在如何在所有可用 标题* 上使用 通配符 进行 搜索 ? *** 类似于 但提供一个或多个通配符的东西。例如,搜索“ ”并解析来自elasticsearch的响应以最终返回如下内容: 谢谢! 问题答案: Elasticsearch在常规匹配查询中提供正则表达式支持 给你这个 要更新到您的问题URI搜索,我不确定是否可行,如果使

  • 问题内容: 我为此感到挣扎,我觉得应该可以,但是也许我在做一些愚蠢的事情。搜索: 返回Source1和Source2的数据。在下面添加术语搜索,我希望返回仅包含Source1s的第一次搜索的子集。使用第一个查询或单独运行时,不返回任何内容。 我知道很难看到这些文档,但是可以说“ Element.sourceSystem.name”存在并且可以使用,因为第一个搜索可以正常工作-非常感谢所有输入。 问

  • 我遵循了本教程,并为索引实现了以下内容:

  • 我想请你帮忙。我想搜索一个词里面的标题和内容。下面是结构 查询字符串如下所示,我希望在类似“15-game”的文本中搜索“15-g”: 请接受我的道歉,如果我重复的问题,但我无法找到发生了什么,为什么它没有返回任何结果。 我已经看过了: 提前谢谢你!

  • 尝试使用通配符进入和弹性搜索精确短语搜索时遇到问题query_string。 希望能够返回结果,这将是所有变体的精确短语。i、 e.“库尔斯酿酒厂”、“库尔斯酿酒厂”、“库尔斯酿酒厂”等。 我不同意这种方法,但想搜索大部分文档以找到匹配的1或2个字段。