3

私はそのようなクエリを使用しています:

var query = "*" + QueryParser.Escape(input) + "*";
session.Query<User, UsersByEmailAndName>().Where(x => x.Email.In(query) || x.DisplayName.In(query));

単純なインデックスのサポートにより:

public UsersByEmailAndName()
{
    Map = users => from user in users
                   select new
                          {
                              user.Email,
                              user.DisplayName,
                          };            
}

ここで私はそれを読んだ:

「デフォルトでは、RavenDB はすべてのコンテンツに対して LowerCaseKeywordAnalyzer と呼ばれるカスタム アナライザーを使用します。(...) 各フィールドのデフォルト値は、ストアの FieldStorage.No とインデックスの FieldIndexing.Default です。」

インデックスには次のフィールドが含まれます。

DisplayName -"jarek waliszko"および電子メール-"my_email@domain.com"

そして最後に、次のとおりです。

queryのようなものである*_email@**ali*、結果が問題ない場合。しかし、例えば内でスペースバーを使用している間*ek wa*、何も返されません。なぜ、どのように修正するのですか?

ところで:私はRavenDBを使用しています-ビルド#960

4

3 に答える 3

3

検索するフィールドの [インデックス] オプションを [デフォルト] ではなく [分析] に変更します。

于 2012-09-07T00:20:39.707 に答える
1

というわけで、方法を考えてみました。これが「正しい方法」かどうかはわかりませんが、私にとってはうまくいきます。

クエリは次のように変更されます。

var query = string.Format("*{0}*", Regex.Replace(QueryParser.Escape(input), @"\s+", "-"));

索引は次のように変更されます:

public UsersByEmailAndName()
{
    Map = users => from user in users
                   select new
                          {
                              user.Email,
                              DisplayName = user.DisplayName.Replace(" ", "-"),
                          };
}

ユーザー入力テキストの空白をダッシュ​​に変更し、インデックス付き表示名でスペースバーをダッシュ​​に変更しました。クエリは、現在期待される結果を提供します。他に特に変わったことはありません。以前と同じように LowerCaseKeywordAnalyzer を使用しています。

于 2012-09-06T14:25:42.427 に答える
1

Lucene のクエリ パーサーは、検索語のスペースを実際のクエリの区切りとして解釈し、検索に含めません。スペースの後に表示される検索語の部分も無視されます。

したがって、空白文字の前にバックスラッシュ文字を追加して、空白文字をエスケープする必要があります。を照会してみてください*jarek\ waliszko*

于 2013-05-03T11:11:38.313 に答える