【发布时间】:2020-08-27 09:37:58
【问题描述】:
我想使用elasticsearch来搜索与用户提供的搜索词相关的文档(文档文本是荷兰语,也假设用户搜索的词也是荷兰语) .
我还使用同义词为搜索的单词返回相同的文档,这些单词拼写不同但在荷兰语中表示相同的意思。我将这些同义词存储在 elasticsearch 的 config 文件夹中的 synonyms.txt 文件中。
为了测试搜索是否正常,我使用单词loopbaan 作为用户可能搜索的示例。此外,在 synonyms.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 因为我使用荷兰语词干分析器,但是 loopban 确实NOT 与loopbaan 的意思相同在荷兰语中,并且不出现在我在 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")?。 p>
注意:我知道在 elasticsearch 中存在 stemmer-override,但我希望搜索尽可能通用,并且每次荷兰语词干分析器做得不好时,我都不会在词干分析器覆盖中添加单词。我还希望 loopbaan 的复数形式(即loopbanen)返回与我搜索 loopbaan 时完全相同的结果。这就是我使用词干分析器的原因。
这就是我创建文档索引的方式:
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"
}
}
}
}
}
更新:
复制的 2 个同义词:
loopbaan, carriere => loopbaan, carriere
schakelen, koppelen, toggelen => schakelen, koppelen, toggelen
要复制的 3 个文档(第一个和第三个示例应与 loopbanen 和 loopbaan 匹配,因为它们包含 carriere):
{
"title": "Hoezo is dit goed gedaan in het onderwijs?"
"content": "Werken is goed voor de mensen die in Nederlands wonen. Het verbetert de economie en de welzijn van de mensen. Carrière opbouwen is ook zeer belangrijk voor de specialisatie van de nederlandse mensen in onze samenleving."
},
{
"title": "Dit slaat toch nergens op dat mensen dit kunnen doen."
"content": "Mensen moeten koppelen. Wat nou "dit" is in deze context weet ik ook niet maar ja zo kan je zien dat elke woord zomaar iets kan betekenen toch? Zou zeggen van wel maar dit heeft niks te maken met iets dus de mazzel."
},
{
"title": "Werken moet door iedereen gedaan worden en niet alleen door paar mensen in nederland"
"content": "Werken moet door iedereen gedaan worden en niet alleen door paar mensen in nederland. Het moet echt zo zijn dat mensen carrieres opbouwen en niet alleen thuis zitten, want dat is slecht voor gezondheid van de mensen en de economie over het algemeen."
}
【问题讨论】:
标签: database elasticsearch search text full-text-search