【问题标题】:Custom analyzer with edgeNgram filter doesn't work带有 edgeNgram 过滤器的自定义分析器不起作用
【发布时间】:2018-04-07 12:54:14
【问题描述】:

我需要在我的网站中进行部分搜索。最初我直接使用了 edgeNgramFeild,它没有按预期工作。所以我使用自定义搜索引擎和自定义分析器。我使用的是 Django-haystack。

'settings': {
       "analysis": {
           "analyzer": {
               "ngram_analyzer": {
                   "type": "custom",
                   "tokenizer": "lowercase",
                   "filter": ["haystack_ngram"]
               },
               "edgengram_analyzer": {
                   "type": "custom",
                   "tokenizer": "lowercase",
                   "filter": ["haystack_edgengram"]
               },
               "suggest_analyzer": {
                   "type":"custom",
                   "tokenizer":"standard",
                   "filter":[
                       "standard",
                       "lowercase",
                       "asciifolding"
                   ]
               },
           },
           "tokenizer": {
               "haystack_ngram_tokenizer": {
                   "type": "nGram",
                   "min_gram": 3,
                   "max_gram": 15,
               },
               "haystack_edgengram_tokenizer": {
                   "type": "edgeNGram",
                   "min_gram": 2,
                   "max_gram": 15,
                   "side": "front"
               }
           },
           "filter": {
               "haystack_ngram": {
                   "type": "nGram",
                   "min_gram": 3,
                   "max_gram": 15
               },
               "haystack_edgengram": {
                   "type": "edgeNGram",
                   "min_gram": 2,
                   "max_gram": 15
               }
           }
       }
   } 

使用edgengram_analyzer 进行索引,使用suggest_analyzer 进行搜索。这在一定程度上奏效了。但是,它不适用于数字,例如,当输入 30 时,它不会搜索 303 以及包含字母和数字组合的单词。所以我搜索了各种网站。

他们建议使用标准或whitespace 标记器和haystack_edgengram 过滤器。但它根本不起作用,撇开数字部分搜索甚至对字母都不起作用。建议后的设置:

'settings': {
        "analysis": {
            "analyzer": {
                "ngram_analyzer": {
                    "type": "custom",
                    "tokenizer": "lowercase",
                    "filter": ["haystack_ngram"]
                },
                "edgengram_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitepsace",
                    "filter": ["haystack_edgengram"]
                },
                "suggest_analyzer": {
                    "type":"custom",
                    "tokenizer":"standard",
                    "filter":[
                        "standard",
                        "lowercase",
                        "asciifolding"
                    ]
                },
            },
            "filter": {
                "haystack_ngram": {
                    "type": "nGram",
                    "min_gram": 3,
                    "max_gram": 15
                },
                "haystack_edgengram": {
                    "type": "edgeNGram",
                    "min_gram": 2,
                    "max_gram": 15
                }
            }
        }
    } 

除了lowercase tokenizer 之外的任何东西都可以与 django-haystack 一起使用吗?或haystack_edgengram 过滤器对我不起作用。据我所知,它应该像这样工作。将2 Lazy Dog 视为提供的文本。它应该使用whitespace [2,Lazy,Dog] 获得这样的令牌。然后应用haystack_edgengram 过滤器,它应该会生成令牌[2,la,laz,lazy,do,dog]。它不能像这样工作。我做错了什么吗?

我的要求是例如文本2 Lazy Dog,当某些类型2 Laz 应该可以工作时。

已编辑:

在我的假设中,小写分词器工作正常。但是,在上述文本的情况下,它将省略 2 并创建令牌 [lazy,dog]。为什么标准或空白分词器不能工作?

【问题讨论】:

    标签: python django elasticsearch django-haystack


    【解决方案1】:

    在 ngrams 过滤器中,您定义 min_gram 是创建标记的最小长度。在您的情况下,“2”的长度为:1,因此在 ngram 过滤器中将被忽略。

    解决此问题的最简单方法是将 min_gram 更改为 1。更复杂的方法是结合一些标准分析器来匹配整个关键字(对较短的术语有用)和用于部分匹配的 ngram 分析器(对于较长的术语) -也许有一些布尔查询。

    您也可以将 ngram 更改为从“1”字符开始,但在您的搜索框中需要至少 3 个字母才能将查询发送到 Elasticsearch。

    【讨论】:

      【解决方案2】:

      根据@jgr 的建议,我自己找到了答案:

      ELASTICSEARCH_INDEX_SETTINGS = {
          "settings": {
              "analysis": {
                  "analyzer": {
                      "ngram_analyzer": {
                          "type": "custom",
                          "tokenizer": "standard",
                          "filter": ["haystack_ngram"]
                      },
                      "edgengram_analyzer": {
                          "type": "custom",
                          "tokenizer": "standard",
                          "filter": ["haystack_edgengram","lowercase"]
                      },
                      "suggest_analyzer": {
                          "type":"custom",
                          "tokenizer":"standard",
                          "filter":[
                              "lowercase"
                          ]
      
                      }
                  },
                  "filter": {
                      "haystack_ngram": {
                          "type": "nGram",
                          "min_gram": 1,
                          "max_gram": 15
                      },
                      "haystack_edgengram": {
                          "type": "edgeNGram",
                          "min_gram": 1,
                          "max_gram": 15
                      }
                  }
              }
          }
      }
      
      ELASTICSEARCH_DEFAULT_ANALYZER = "suggest_analyzer"
      

      【讨论】:

      • 请将解决问题的功劳归功于@jgr 而不是自己
      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      相关资源
      最近更新 更多