Elasticsearch搜索土耳其语字符

时间:2017-02-25 21:31:05

标签: elasticsearch

我有一些文档,我正在使用elasticsearch进行索引。但有些文件是用大写字母写的,而Tukish字符则是改变的。例如,“kürşat”被写为“KURSAT”。

我想通过搜索“kürşat”找到这个文件。我怎么能这样做?

由于

1 个答案:

答案 0 :(得分:7)

查看asciifolding token filter

以下是您在Sense中尝试的一个小例子:

<强>索引:

DELETE test
PUT test
{
  "settings": {
    "analysis": {
      "filter": {
        "my_ascii_folding": {
          "type": "asciifolding",
          "preserve_original": true
        }
      },
      "analyzer": {
        "turkish_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_ascii_folding"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "turkish_analyzer"
        }
      }
    }
  }
}

POST test/test/1
{
  "name": "kürşat"
}

POST test/test/2
{
  "name": "KURSAT"
}

查询:

GET test/_search
{
  "query": {
    "match": {
      "name": "kursat"
    }
  }
}

<强>响应:

 "hits": {
    "total": 2,
    "max_score": 0.30685282,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "2",
        "_score": 0.30685282,
        "_source": {
          "name": "KURSAT"
        }
      },
      {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 0.30685282,
        "_source": {
          "name": "kürşat"
        }
      }
    ]
  }

<强>查询:

GET test/_search
{
  "query": {
    "match": {
      "name": "kürşat"
    }
  }
}

<强>响应:

 "hits": {
    "total": 2,
    "max_score": 0.4339554,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 0.4339554,
        "_source": {
          "name": "kürşat"
        }
      },
      {
        "_index": "test",
        "_type": "test",
        "_id": "2",
        "_score": 0.09001608,
        "_source": {
          "name": "KURSAT"
        }
      }
    ]
  }

现在'preserve_original'标志将确保如果用户键入:'kürşat',那么具有该完全匹配的文档将比具有'kursat'的文档排名更高(注意两个查询响应的得分差异)。

如果您希望得分相等,则可以将该标志设为false。

希望我的问题正确!