Elasticsearch为什么不返回包含几乎相等词的文档?

问题描述 投票:1回答:1

我想使用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"
                }
            }
        }
    }
}
database elasticsearch search text full-text-search
1个回答
0
投票
您正在使用一个分析器建立索引,而使用另一个分析器进行搜索。推荐的做您想做的方法可以在here
© www.soinside.com 2019 - 2024. All rights reserved.