【问题标题】:partial word search with haystack/elasticsearch使用 haystack/elasticsearch 进行部分词搜索
【发布时间】:2012-11-27 21:34:56
【问题描述】:

我们目前正在使用 elasticsearch 后端运行 haystack。我们无法正确运行部分单词搜索。

我们目前有一个包含 EdgeNgramField 的索引。我曾尝试在此字段上进行搜索,但除非完全匹配,否则我找不到任何结果。我正在尝试使用它来查找产品,例如:我输入“sun”,我不会得到“sunglasses”的结果。

我开始直接在 elasticsearch 上使用 curl 命令,看看我是否能弄清楚发生了什么。我什至直接使用 curl 以及 ngram 分析器创建了自己的索引,并且使用部分单词搜索获得了正确的结果。

另一个有趣的事情是:如果我直接在我直接使用 curl 创建的 elasticsearch 上的测试索引上使用 curl 运行 _mapping 命令,我会得到以下内容:“testfield”:{“type”:“string”,“ Analyzer":"test_analyzer"},但是,如果我在 haystack 创建的索引上运行映射命令,它只有 "type":"string"。它没有说明它应该使用的 edgengram_analyzer。

有什么想法吗?

【问题讨论】:

    标签: python elasticsearch django-haystack


    【解决方案1】:

    我认为 elasticsearch_backend.py 的 haystack 中有一个错误,它没有正确使用 pyelasticsearch 第 868 行看起来像:

    self.conn.put_mapping('modelresult', current_mapping, index=self.index_name)
    

    如果你把它替换为:

    self.conn.put_mapping(doc_type='modelresult', mapping=current_mapping, index=self.index_name)
    

    这就是 pyelasticsearch 所期望的,然后您将看到 edgengram_analyzer 已添加到您的 EdgeNgramField 字段中。至少它对我有用。

    【讨论】:

    • 按照@racedo 提到的那样做。并且不要忘记更新您的索引,它会起作用
    • 我目前面临的问题是,只有当单词与产品的开头匹配时,自动完成才会返回结果。但否则它将无法正常工作。所以如果我搜索“太阳”,它将返回“太阳镜”。但如果我搜索“玻璃”,我没有得到任何结果。虽然它也应该返回“太阳镜”??!
    • racedo,部分解决了问题。谢谢!但我现在面临 Salma 提到的问题,即它只在单词的开头部分匹配。
    • 没问题。你想要的是 ngram 而不是边缘 ngram。 Edge NGram 旨在匹配单词的开头或结尾,而 ngram 表示单词中的一组连续字母(至少在信息提取术语中)。顺便说一句,如果这不能回答您的第二个问题,请创建一个新问题,以便我们可以通过答案进行讨论。
    • 这在规范的 elasticsearch 后端是否已修复?还是我还需要做这个改变?
    猜你喜欢
    • 1970-01-01
    • 2013-08-13
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多