我想使用elasticsearch搜索与用户提供的搜索词相关的文档(文档文本在荷兰,也假定用户搜索的单词也在荷兰。
我还使用同义词为拼写不同但在荷兰语中表示相同意思的搜索词返回相同的文档。我将这些同义词存储在elasticsearch的config文件夹中的aliases.txt文件中。
[为了测试搜索是否正常工作,我使用单词loopbaan
作为用户可能搜索内容的示例。此外,在onymous.txt文件中,我将此词与其同义词carriere
链接在一起。这是通过以下格式完成的:
...
loopbaan, carriere
...
现在,当我使用分析仪分析loopbaan
时,就像这样:
GET /documents/_analyze
{
"analyzer": "test_analyzer",
"text": "loopbaan"
}
我得到以下结果:
{
"tokens": [
{
"token": "loopban",
"start_offset": 0,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "carrier",
"start_offset": 0,
"end_offset": 8,
"type": "SYNONYM",
"position": 0
}
]
}
我知道loopbaan
被转换为loopban
,因为我使用了荷兰语词干,BUT loopban
确实NOT的意思与荷兰语中的loopbaan
相同,并且是NOT 出现在我在documents索引中建立索引的任何文本中。
因此,当我使用以下查询搜索loopbaan
时:
{
"query": {
"simple_query_string": {
"query": "loopbaan",
"fields": [
"content^1.0"
],
"analyzer": "test_analyzer",
"flags": -1,
"default_operator": "or",
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"fuzzy_transpositions": true,
"boost": 1
}
}
}
我没有结果:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
问题:如何通过搜索单词“ loopbaan”来获得预期的结果(我知道至少有5个文档包含单词“ loopbaan”)?。
NOTE:我知道elasticsearch中存在stemmer-override
,但我希望搜索尽可能笼统,并且每次荷兰词干处理不好时都不要在词干覆盖中添加单词。我也希望loopbaan的复数(即loopbanen
)返回与搜索loopbaan时完全相同的结果。这就是为什么我使用词干分析器。
这就是我创建documents索引的方式:
PUT /documents
{
"aliases": {},
"mappings": {
"properties": {
"content": {
"type": "text"
},
"title": {
"type": "text"
}
}
},
"settings": {
"analysis": {
"filter": {
"test_synonyms": {
"type": "synonym",
"synonyms_path": "synonyms.txt",
"lenient": "true"
},
"dutch_stemmer": {
"type": "stemmer",
"language": "dutch"
},
"dutch_stopwords": {
"type": "stop",
"stopwords": "_dutch_"
},
"test_ascii_folding": {
"type": "asciifolding"
}
},
"analyzer": {
"test_analyzer": {
"filter": [
"lowercase",
"test_ascii_folding",
"dutch_stopwords",
"dutch_stemmer",
"test_synonyms"
],
"tokenizer": "standard"
}
}
}
}
}