使用特殊字符

时间:2018-06-01 03:52:43

标签: java search solr

我刚刚开始研究Solr。有一个电话字段,它已在架构中定义,如下所示

<field docValues="true" indexed="true" multiValued="true" name="phones" stored="true" type="StrField"/>

根据我的理解,字符串字段将尝试进行完全匹配,但用户可以使用任何格式搜索具有特殊字符的电话号码,如(111)111-1111。所以我使用ClientUtils.escapeQueryChars为特殊字符添加斜杠,但搜索不会产生任何结果。我一直试图理解为什么,是否有任何标准,特殊字符不能转换为字符串字段?我不认为tokenizer很重要,因为它是字符串字段,我使用edismax解析器。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用Solr 7.3.1我复制了您已经问过的内容并且可以确认,只要您正确地逃离(),您就可以了获得你正在寻找的点击量。

<强>模式

  • id:string
  • 电话:字符串(多值,docvalues,索引,存储)

<强>文档

{
  "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

{
    "id":"doc1",
    "phones":["(111) 111-1111"],
    "_version_":1602190176246824960}]
}

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

{
    "id":"doc2",
    "phones":["111 111-1111"],
    "_version_":1602190397829808128}]
}

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

"response":{"numFound":0,"start":0,"docs":[]}

行为完全如描述 - 仅与完全匹配。

使用PatternReplaceCharFilterFactory

获取所需的行为

让我们创建一个自定义字段类型,删除任何不是数字或字母的内容:

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中执行此操作),并重新索引我们的文档 - 现在使用新的字段名称:

  {
    "id":"doc1",
    "phone_stripped":"(111) 111-1111"
  },
  {
    "id":"doc3",
    "phone_stripped":"111 (111)-1111"
  },
  {
    "id":"doc2",
    "phone_stripped":"111 111-1111"
  }

然后我们只搜索1111111111

"response":{"numFound":3,"start":0,"docs":[ .. all our docs ..]

使用上一个搜索phone_stripped:\(111\)\ 111-1111

"response":{"numFound":3,"start":0,"docs":[ .. all our docs ..]

为了确保我们无法用不可言喻的方式破坏事物,让我们搜索phone_stripped:\(111\)\ 111-1112

"response":{"numFound":0,"start":0,"docs":[]