当前位置: 首页 > 知识库问答 >
问题:

在弹性搜索中查找带有特殊字符的子字符串

濮丁雷
2023-03-14

我刚开始做弹性搜索。我想通过子字符串搜索,它由数字和像“/”和“-”这样的符号组成。例如,我使用默认设置和一个索引字段创建索引:

curl -XPUT "http://localhost:9200/test/" -d ' {
    "mappings" : {
            "properties": {
                    "test_field": {
                            "type": "string"
                    }
            }
    }
} '

然后,我将一些数据添加到我的索引中:

curl -XPOST "http://localhost:9200/test/test_field" -d '{ "test_field" : "14/21-35" }'
curl -XPOST "http://localhost:9200/test/test_field" -d '{ "test_field" : "1/1-35" }'
curl -XPOST "http://localhost:9200/test/test_field" -d '{ "test_field" : "1/2-25" }'
curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{"query":{"query_string":{"query":"1/1*"}}}'

不返回命中。如果我移除星形符号,那么作为回应,我会看到两个点击:“1/1-35”和“1/2-25”。如果我尝试用反斜杠(“1\/1*”)转义斜杠符号,结果分别是相同的。

当我的查询中有“-”符号时,那么我必须转义这个Lucene特殊字符。因此我发送下一个搜索请求:

curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{"query":{"query_string":{"query":"*1\-3*"}}}'

并且返回解析错误。如果我把escape(“\\”)减去一倍,那我就没有结果了。

我尝试在我的自定义分析器中使用nGram过滤器,但它不适合搜索引擎的要求。

如果有人遇到这个问题,请回答。

共有1个答案

陈扬
2023-03-14

默认分析器将在索引时从数据中删除所有特殊字符。您可以使用关键字分析器,或者在索引时不分析数据:

curl -XPUT "http://localhost:9200/test/" -d ' {
    "mappings" : {
            "properties": {
                    "test_field": {
                            "type": "string",
                            "index": "not_analyzed"
                    }
            }
    }
} '
 类似资料:
  • 我还没有为索引创建任何显式设置。谢了。

  • 因此,默认情况下,field1是通过使用默认分析器进行弹性搜索来分析的。 我在下面搜索短语查询,但它没有返回任何结果。 因此弹性搜索短语查询不适合于OR运算符。知道为什么它不起作用吗?它是弹性搜索的一个限制,因为文本中有特殊的字符连字符(-)?

  • 我刚开始使用hibernate lucene搜索。从几天以来,我一直致力于搜索关键字与特殊字符。我正在使用MultiFieldQueryParser进行精确短语匹配以及布尔搜索。但在这个过程中,我无法得到搜索关键字的结果,如“有1年以上的经验”,如果我没有在搜索关键字周围添加任何引号,那么我就得到了结果。所以我在执行lucene查询时观察到的是,它正在转义特殊符号(+)。我正在使用Standard

  • 我有一个集合的联系人结构如下: 因为“susan@xpto.com”上的点 如何逃脱这点? 我尝试了和但没有成功。

  • 我有一个问题与搜索的特殊字符在solr。我的文档有一个字段标题,有时它可以像泰坦尼克号-1999(它有字符-)。当我试图搜索索尔与"-"我收到一个400错误。我试图逃避这个角色,所以我尝试了像“-”和“\-”这样的东西。有了这些变化,solr不会用错误来回应我,但它会返回0个结果。 如何在solr admin中搜索具有该特殊字符(如“-”或“”?)的内容??? 问候 在这里更新您可以看到我当前的s

  • 我有一个HashMap,里面有键和值。我想用字符串中映射的值替换键。 在字符串中,键被写成@keyname或@“keyname”,这些应替换为map.get(“keyname”) 假设我们的地图是这个 所以如果我们处理字符串“Hello world,Iam@key1 years old.”,它将变成“Hello world,Iam 2 years old.”。 我们可以用@“key1”代替@key