1

Available Job position Indexに対して、以下のような 2 つのクエリを実行するとします。

  • PHP 開発者
  • ルビー開発者

PHP Programmerのような単純なブールANDクエリの位置を実行すると、 developerの存在が不足するため除外されます。Ruby 開発者を含むPHP 開発者ドキュメントに対してORブールクエリを実行すると、結果にも含まれます。

PHP Developerというフレーズで、PHPがDeveloperよりも重要であることを検出する最良の方法は何ですか?

そのため、 PHP Developerに対して検索を実行すると、PHP用語が結果に表示される必要がありますが、 Developerセクションはスコアを上げるだけです。

4

3 に答える 3

3

通常の「一致」クエリを使用して、「cutoff_frequency」パラメーターを追加できます。お気に入り:

{
     "query": {
           "match": {
                "<field_name>": {
                      "query": "PHP Developer",
                      "operator": "AND",
                      "cutoff_frequency": 0.001
                }                
           }
     }
}

そうすれば、ドキュメントの 0.1% 未満に出現する各用語は「重要」と見なされ、「必須」になりますが、他の用語は「必須」ではなく、スコアを上げるだけです。「開発者」は「PHP」よりも一般的であるため、「PHP」は必須ですが、「開発者」はオプションですが、評価は高くなります。「PHP」はまだかなり一般的である可能性があるため、適切な頻度を微調整する必要があることに注意してください!

于 2016-07-17T19:58:21.657 に答える
1

簡単な答えはないと思います。あなたが持っている開発者のような用語の量に応じて、Boosting クエリのようなことを行うことができます。検索クエリから用語をフィルタリングして、Boosting クエリを作成する必要があります。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html

より良いアプローチは、共通用語クエリを使用することです。ここでは、多くのドキュメントに含まれる用語、「高頻度」の用語、重要度の低い用語を指定できます。AND でlow_freq_operatorを使用すると、目的を達成するのに役立ちます。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-common-terms-query.html

于 2016-07-16T07:25:51.687 に答える
0

フィールドのカスタム アナライザーを使用して、フィールドのトークンを常に一貫させることができます。この場合、タイプが「stop」のトークン フィルター (ストップワード フィルター) を、ストップワード リストに「Developer」を指定して使用できます (その他、事実上無視する必要があるものはすべて)。これはインデックス作成時にクエリとデータの両方に適用されるため、インデックスに「PHP Developer」があり、クエリに「PHP」がある場合、それらは両方とも「PHP」のトークンに変換されるため、完全一致。

「Developer」と入力するさまざまな方法に対してこれをより堅牢にするために、おそらく「小文字」のトークン フィルターも使用することをお勧めします。そのため、ストップワードは代わりに「developer」になります。

これには、データの再インデックスが必要になることに注意してください。

設定ファイルは次のようになります。

{
  "analysis": {
     "filter": {
        "job_stopwords": {
            "type": "stop",
            "stopwords": [
                "developer", "dev"
            ]
        }
     },
     "analyzer": {
        "job_analyzer": {
            "type": "custom",
            "filter": [
                "lowercase", "job_stopwords"
            ]
        }
     }
}

次に、ドキュメントのマッピングのジョブ フィールドに job_analyzer アナライザーを適用する必要があります。

「開発者」がヒットのスコアを上げるには、デフォルトのアナライザーを使用するフィールドのマッピングにサブフィールドを追加できます。次に、job_analyzer を「必須」にして、デフォルトの分析済みバージョンを「すべき」にすることができます。

マッピングは次のようになります。

{
   "job_posting": {
       "properties": {
           "job_type": {
               "type": "string",
               "analyzer": "job_analyzer",
               "fields": {
                    "default": {
                        "type": "string"
                    }
                }
            }
        }
    }
}

クエリは次のようになります。

{
   "query": {
       {
          "bool": {
             "must": {
                 "match": {
                      "job_type" : "PHP Developer"
                 }
             },
             "should": {
                 "match": {
                      "job_type.default" : "PHP Developer"
                 }
             }
          }
      }
   }
}

どちらが「PHP Developer」、「php dEv」、「PHP」に一致しますが、「PHP Developer」が最も高いスコアを取得します。

于 2016-07-21T09:57:50.150 に答える