5

フィールドの各トークンが、ユーザーの検索で少なくとも1つのトークンと一致することを確認する必要があります。

これは、簡略化のための一般化された例です。

させてStore_Name = "Square Steakhouse"

ユーザーがSquareまたはSteakhouseを検索するときに、このドキュメントに一致するクエリを作成するのは簡単です。さらに、デフォルトのアナライザーにkstemフィルターが接続されているため、Steakhouseも一致する可能性があります。

{
  "size": 30,
  "query": {
    "match": {
      "Store_Name": {
        "query": "Square",
        "operator": "AND"
      }
    }
  }
}

残念ながら、Store_Nameフィールドの各トークンを一致させる必要があります。次の動作が必要です。

Query: Square Steakhouse    Result: Match
Query: Square Steakhouses   Result: Match
Query: Squared Steakhouse   Result: Match
Query: Square               Result: No Match
Query: Steakhouse           Result: No Match

要約すれば

  • アナライザーの機能を利用する必要があるため、not_analyzedを使用するオプションはありません。
  • kstem、カスタムシノニム、カスタムchar_filter、小文字フィルター、および標準のトークナイザーを使用する予定です。

ただし、フィールドの各トークンが一致していることを確認する必要があります

これはElasticSearchで可能ですか?

4

1 に答える 1

4

これが良い方法です。

完璧ではありませんが、単純さ、計算、およびストレージの点で適切な妥協点です。

  • フィールドのトークン数にインデックスを付ける
  • 検索テキストのトークン数を取得する
  • フィルタリングされたクエリを実行し、結果間のトークンの数が等しくなるように強制します

トークン数を取得するには、analyzeAPIを使用する必要があります。問題のフィールドと同じアナライザーを使用してください。トークン数を取得するためのVB.NET関数は次のとおりです。

Private Function GetTokenCount(ByVal RawString As String, Optional ByVal Analyzer As String = "default") As Integer
    If Trim(RawString) = "" Then Return 0

    Dim client = New ElasticConnection()
    Dim result = client.Post("http://localhost:9200/myindex/_analyze?analyzer=" & Analyzer, RawString) 'Submit analyze request usign PlainElastic.NET API
    Dim J = JObject.Parse(result.ToString()) 'Populate JSON.NET JObject
    Return (From X In J("tokens")).Count() 'returns token count using a JSON.NET JObject

End Function

これをインデックス時に使用して、問題のフィールドのトークン数を保存することをお勧めします。TokenCountのマッピングにエントリがあることを確認してください

この新しいトークンカウント情報を利用するための優れたElasticSearchクエリは次のとおりです。

{
  "size": 30,
  "query": {
    "filtered": {
      "query": {
        "match": {
          "MyField": {
            "query": "[query]",
            "operator": "AND"
          }
        }
      },
      "filter": {
        "term": {
          "TokenCount": [tokencount]
        }
      }
    }
  }
}
  • [クエリ]を検索語に置き換えます
  • [tokencount]を検索語のトークン数に置き換えます(上記のGetTokenCount関数を使用)

これにより、のトークンと少なくとも同じ数の一致がすべて存在するようになりMyFieldます。

上記にはいくつかの欠点があります。たとえば、フィールド「青赤」を一致させ、ユーザーが「青青」を検索した場合、上記は一致をトリガーします。したがって、一意のトークンフィルターを使用することをお勧めします。また、次のようにフィルターを調整することもできます。

参照

于 2013-01-31T15:21:19.627 に答える