首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >包含特殊字符的Solr字符串字段搜索

包含特殊字符的Solr字符串字段搜索
EN

Stack Overflow用户
提问于 2018-06-01 11:52:43
回答 1查看 1.3K关注 0票数 0

我刚刚开始在Solr上工作。有一个电话字段,它在模式中定义如下

代码语言:javascript
复制
<field docValues="true" indexed="true" multiValued="true" name="phones" stored="true" type="StrField"/>

据我所知,字符串字段将尝试进行精确匹配,但用户可以使用任何格式来搜索带有特殊字符的电话号码,如(111) 111-1111。因此,我使用ClientUtils.escapeQueryChars为特殊字符添加了一个斜杠,但是搜索没有得到任何结果。我一直在尝试理解为什么,是否有任何标准,特殊字符不能转义字符串字段?我不认为标记器很重要,因为它是字符串字段,我使用的是edismax解析器。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 03:35:23

使用Solr 7.3.1,我重现了你的要求,并且可以确认,只要你正确地转义()和,你就会得到你想要的结果。

架构

  • id: string
  • phones: string (多值,文档值,已索引,已存储)

文档

代码语言:javascript
复制
{
  "id":"doc1",
  "phones":["(111) 111-1111"],
  "_version_":1602190176246824960
},
{
  "id":"doc2",
  "phones":["111 111-1111"],
  "_version_":1602190397829808128
},
{
  "id":"doc3",
  "phones":["111 (111)-1111"],
  "_version_":1602190400002457600
}

查询

/select?q=phones:\(111\)\ 111-1111

代码语言:javascript
复制
{
    "id":"doc1",
    "phones":["(111) 111-1111"],
    "_version_":1602190176246824960}]
}

/select?debugQuery=on&q=phones:111\ 111-1111

代码语言:javascript
复制
{
    "id":"doc2",
    "phones":["111 111-1111"],
    "_version_":1602190397829808128}]
}

/select?debugQuery=on&q=phones:1111111111

代码语言:javascript
复制
"response":{"numFound":0,"start":0,"docs":[]}

行为与描述完全相同-仅精确匹配。

使用 PatternReplaceCharFilterFactory获得您想要的行为的

让我们创建一个自定义字段类型,删除除数字或字母以外的所有内容:

代码语言:javascript
复制
curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field-type" : {
     "name":"phoneStripped",
     "class":"solr.TextField",
     "positionIncrementGap":"100",
     "analyzer" : {
        "charFilters":[{
           "class":"solr.PatternReplaceCharFilterFactory",
           "replacement":"",
           "pattern":"[^a-zA-Z0-9]"
        }],
        "tokenizer":{
           "class":"solr.KeywordTokenizerFactory" 
        },
     }
  }
}' http://localhost:8983/solr/foo/schema

然后,我们使用这个新字段类型创建一个名为phone_stripped的新字段(您可以在UI中执行此操作),并重新索引我们的文档-现在使用新的字段名称:

代码语言:javascript
复制
  {
    "id":"doc1",
    "phone_stripped":"(111) 111-1111"
  },
  {
    "id":"doc3",
    "phone_stripped":"111 (111)-1111"
  },
  {
    "id":"doc2",
    "phone_stripped":"111 111-1111"
  }

然后我们只搜索1111111111

代码语言:javascript
复制
"response":{"numFound":3,"start":0,"docs":[ .. all our docs ..]

使用前面的搜索,phone_stripped:\(111\)\ 111-1111

代码语言:javascript
复制
"response":{"numFound":3,"start":0,"docs":[ .. all our docs ..]

为了确保我们没有以难以形容的方式破坏东西,让我们搜索phone_stripped:\(111\)\ 111-1112

代码语言:javascript
复制
"response":{"numFound":0,"start":0,"docs":[]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50635861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档