2016-07-16 6 views
0

は、我々の利用可能なジョブの位置のインデックスに以下のような2つのクエリを実行していると仮定します弾性検索 - クエリで重要な単語を推測するにはどうすればよいですか?

  • PHP開発
  • Rubyの開発者

のような単純なブールクエリ位置を実行しますPHPプログラマは、の開発者の存在のために除外されます。 ORブールクエリPHP開発者Ruby開発者を含むドキュメントも検索結果に含まれます。

フレーズPHP開発にそれを検出するための最良の方法は何ですか、PHP開発よりも重要なのですか?だから、PHP開発に対してPHP用語MUSTを検索を実行

が結果に表示されますが、開発セクションでは、唯一の得点を増加させます。

答えて

2

あなたが定期的に「一致」のクエリを使用し、「cutoff_frequency」パラメータを追加することができます。以下のような:

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

そうすれば、文書の少ないし、0.1%にappers各用語は - 「重要」とみなされ、他の用語は、「必要」が、ではありませんしながら、「必要」になりますスコアを上げるだけです。 「開発者」は「PHP」よりも一般的になりますので、「PHP」は必須ですが、「開発者」はオプションですが高い評価を与えます。 "PHP"は依然としてかなり一般的かもしれないので、を微調整する必要があります。正しい周波数!

+0

おかげさまで、ここでのトリックは、「カットオフ」を正しく調整することですが、スコアが増えるので、まだOKです。 –

+0

単一のトークンの頻度は関係ありませんが、より頻度の低いトークンを作成することは可能ですが、頻度の低いトークンは* MUST *になりますか? –

1

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

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

より良いアプローチは、一般的な用語のクエリを使用するかもしれません。ここでは、多くの文書に含まれる用語である「高頻度」の用語をあまり重要視しないでください。 とlow_freq_operatorをANDで使用すると、達成したいことをお手伝いできます。

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

0

フィールドのカスタムアナライザーを使用して、フィールドのトークンを常に一貫性のあるものにすることができます。この場合、ストップワードリスト(および実質的に無視されるべきもの)に「開発者」というタイプの "stop"(ストップワードフィルタ)タイプのトークンフィルタを使用することができます。これはインデックスとクエリの両方に適用されるので、インデックスに "PHP Developer"があり、クエリに "PHP"がある場合、それらは両方とも "PHP"のトークンに変換されます。完全一致

「開発者」と入力するさまざまな方法でこれをより堅牢にするには、「小文字」のトークンフィルタも使用するとよいでしょう。そのため、ストップワードは代わりに「開発者」になります。

データを再インデックスする必要があることに注意してください。そして、あなたがあなたの文書のためのマッピングでジョブフィールドにjob_analyzerアナライザを適用する必要が

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

設定ファイルは次のようになってしまいます。

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

あなたのマッピングがこのようなものになります。 "PHP開発者を" 一致します

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

、 "PHPのDEV" と「PHP:あなたのクエリは、このようなものになるだろう

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

を"しかし、" PHP Developer "は最高得点を得るでしょう。

関連する問題