如何让Solr不要区分'John'和'JOHN'

时间:2013-03-13 07:08:32

标签: solr

在solr中我必须在我的数据库的'name'字段中获取uniqque值。

因为这个原因,我读到了分组,我得到了理想的结果

{
  "responseHeader":{
    "status":0,
    "QTime":16,
    "params":{
      "indent":"true",
      "q":"name:И*",
      "group.field":"name",
      "group":"true",
      "wt":"json"}},
  "grouped":{
    "name":{
      "matches":2231,
      "groups":[{
          "groupValue":"ИВАН",
          "doclist":{"numFound":1144,"start":0,"docs":[
              {
                "obshtina":"ПЛОВДИВ",
                "phone":"032/670309",
                "timestamp":"2013-03-04T08:43:53.553Z"}]
          }},
        {
          "groupValue":"ИЛИЯ",
          "doclist":{"numFound":177,"start":0,"docs":[
              {
                "obshtina":"БРЕЗОВО",
                "phone":"(3191)2265",
                ..............................

问题是,现在我注意到,不幸的是我有两组实际上是相同的'Иван'和'ИВАН'。问题是我的'name'字段应该是字符串类型所以我可以使用我需要的通配符,所以我不能使它成为文本例如并使用LowerCase过滤器

2 个答案:

答案 0 :(得分:3)

您可以使用KeywordTokenizerFactory(绝对没有标记化,就像字符串字段一样)和LowerCaseFilterFactory来获得您想要的内容。

您仍然可以执行通配符搜索。

答案 1 :(得分:2)

添加到上一个答案,您可以使用新的Solr文本类型,如下所示,在索引时,只需将值存储为小写的单个标记。搜索时只需将搜索文本视为小写的单个标记。因此,您可以获得理想的效果。

      <fieldType name="lcase" class="solr.TextField" positionIncrementGap="100">
     <analyzer type="index">
             <tokenizer class="solr.KeywordTokenizerFactory"/>
             <filter class="solr.LowerCaseFilterFactory" />
         </analyzer>
         <analyzer  type="query">
             <tokenizer class="solr.KeywordTokenizerFactory"/>
             <filter class="solr.LowerCaseFilterFactory" />
         </analyzer>
      </fieldType>