2017-02-25 53 views
0

我有一些文件,我用elasticsearch索引。但有些文件是用大写字母和Tukish字符改变的。例如“kürşat”被写为“KURSAT”。Elasticsearch搜索土耳其字符

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

感谢

+0

如果你想以相反的方式('kürşat'->'KURSAT'),这很容易,但这样做,即试图推断'U'应该是'ü'并不容易,因为'U'也可以是一个正常的'u'(这在土耳其语中也是有效的)。 'S'也一样。我想你需要以某种方式在字典中查找单词。 – Val

+0

这是确切的问题。将所有“U”字符转换为“ü”很容易,但很难确定哪个“u”是真实的“u”或“ü”。当我搜索“kürşat”时,我想检索“kursat”和“kürşat” –

回答

2

看看在asciifolding token filter

这里是一个小例子让你尝试在意识:

指数:

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'的文档(注意两个查询响应的分数的差异)。

如果您希望得分相同,您可以将该标记置于假。

希望我解决了你的问题!