1

Django アプリに検索を実装するためのバックエンドとして、Haystack と ElasticSearch を使用しています。ステミングの処理方法がわかりません。インデックス付きモデルのテキストに「embedded」という単語が含まれています。「埋め込み」を検索すると、正しい結果が得られます。「埋め込み」で検索してもヒットしません。

ドキュメントが示す最も簡単な方法でクエリを実行しています。

SearchQuerySet().filter(content='embed')

コードを調べたところ、ElasticSearch が次のようにヒットしていることがわかりました。

import requests
url = 'http://127.0.0.1:9200/haystack/modelresult/_search?from=0&size=20'
kwargs = {"data": '{"query": {"filtered": {"filter": {"fquery": {"query": {"query_string": {"query": "django_ct:(component_catalog.component)"}}, "_cache": true}}, "query": {"query_string": {"query": "(embed)", "default_operator": "AND", "default_field": "text", "auto_generate_phrase_queries": true, "analyze_wildcard": true}}}}}', "timeout": 10}
requests.get(url, **kwargs)

質問:

Haystack がステミングされた結果を返さないのはなぜですか?

とは(embed)どういう意味ですか?

4

1 に答える 1

1

query_stringLucene のクエリ構文を使用するため(embed)、「埋め込み」を中心とした論理グループを表します。Lucene docs から、これは例です:

(jakarta OR apache) AND website

あなたの状況では、それを無視することができます。おそらく、Haystack が自動挿入するものです。

私の最初の傾向は、あなたのマッピングが間違っていると言うことです。フィールドをどのように分析し、インデックスを作成しましたか? Snowball ステマーを使用しましたか?

curl を使用して、さまざまなアナライザーがどのように応答するかをテストできます。これは、必要な結果が得られない場合に便利なトリックです。

curl -X GET "http://localhost:9200/test/_analyze?analyzer=snowball&pretty=true" -d "embedded"
{
   "tokens" : [ {
      "token" : "embed",
      "start_offset" : 0,
      "end_offset" : 8,
      "type" : "<ALPHANUM>",
      "position" : 1
    } ]
}
于 2012-08-01T03:54:11.027 に答える