2017-08-01 17 views
0

私は、検索用語の配列をトークン化したデータ構造を持っています。文書内の複数の検索語を検索する

{ 
    id: "some_id", 
    name: "Bob's diner and eatery", 
    searchTerms: ["bob", "bobs", "diner", "eatery"] 
} 

私は次のクエリ私は私が見てみたい複数の検索条件を持っているところ私が探しに行くかどう

SELECT VALUE 
    restaurant 
FROM root 
    restaurant 
JOIN 
    word 
IN 
    restaurant.searchTerms 
WHERE 
    CONTAINS(word, @SearchTerm) 

を使用して1つの用語を検索することができますか?複数の検索語がある場合、検索用語にすべての検索語または検索語の一部が含まれている場合にのみ、ドキュメントが一致します。 「レストラン」は、一致する検索語ではないので

["bobs", "restaurant"] 

["bo", "eat"] 
["bobs", "diner"] 

しかし、次のではないだろう:以下は、例えば一致します。

+0

おそらくあなたが探しているものではないかもしれませんが、これはサーバ側で実行されるストアドプロシージャで簡単に実装できます –

+0

@JesseCarterこれを詳しく説明してください。私はストアドプロシージャに反対しない、別の答えをしてください。今これを達成する唯一の方法であれば、あなたのアプローチを見ることに興味があります。 –

答えて

3

2のアプローチ:

SQLクエリ

あなたは配列の完全なトークンで検索する場合、することができますARRAY_CONTAINSORオペレータ

SELECT * 
FROM c 
WHERE ARRAY_CONTAINS(c, token1) OR ARRAY_CONTAINS(c, token2) 

はここexample query

です

Azure Search IndトップAzureのコスモスDB上のEXER

あなたは(などファジーテキスト検索、スペルミス、)豊富な全文検索を行いたい場合は、あなたがAzureのコスモスDBコンテナの上にAzureの検索検索インデクサーを追加することができます:https://docs.microsoft.com/en-us/azure/search/search-howto-index-documentdb

+0

完全なトークンを検索している場合は、n個のトークンを検索するパラメータとして文字列の配列を渡す必要がありますか、またはn個の異なるクエリを作成する必要がありますか?あなたが言っているのは、文字列contains関数を使ってOR演算子で複数の一致を検索することができないということです。これについては確かですか? –

+0

システム・ファンクションARRAY_CONTAINSは、基本的に要素配列上での等価一致です。したがって、データベース索引上で実行できます。 String CONTAINSシステム関数は部分文字列一致であるため、コレクション内の索引ルックアップ用に最適化することはできません。この領域内の索引付き検索のために最適化できる唯一のString関数は、範囲索引(順序が保持される)でSTARTS_WITHです。文字列CONTAINS以外のクエリフィルタに他の述語がない場合、クエリにスキャンが必要となり、RUコストが高くなる可能性があることに注意してください。 –

+0

文字列は技術的には機能しますが、大きなコレクションをスキャンする場合は最適ではない場合があります。 –

関連する問題