none
Visua Studio Online における日本語の検索不具合 RRS feed

  • 質問

  • Visual Studio Online でプロジェクト管理をしていますが、日本語の検索がどうやら正常に動作していないようです。

    ブランクなどで区切られた単語は検索できるますが、通常の日本語は単語をブランクで区切ることはしませんので、事実上検索機能が使えない状態です。

    おそらくこれは、検索エンジンが英語のように単語がブランクで区切られた言語向けになっているのではないかと推測できます。

    何か解決策をお持ちでしたら教えて頂けると助かります。

    2015年12月17日 1:52

回答

  • Webで完結しなくてもいいなら直接アクセスする手段は提供されているので、全文取り出してローカルで抽出するとか。
    VisualStudioの上位版を持っていると自動でインストールされるアセンブリもnugetで得られるみたいです。
    とりあえずのアクセスできることしか試せてませんがRESTでも可能っぽいのでJavascriptで引っ張ってこればwebでも完結させられないこともないかも

    using System;
    using System.Net;
    using System.Collections.Generic;
    using Microsoft.TeamFoundation.Client;
    using Microsoft.TeamFoundation.Framework.Common;
    using Microsoft.TeamFoundation.Framework.Client;
    using Microsoft.TeamFoundation.WorkItemTracking.Client;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Uri tfsUri = new Uri("https://********.visualstudio.com/");
                UICredentialsProvider pr = new UICredentialsProvider();
                var cre = CredentialCache.DefaultNetworkCredentials;
                using (var configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri))
                {
                    //HKCU\Software\Microsoft\VSCommon\14.0\ClientService\TokenStrage\VisualStudio\VssApp
                    var collectionNodes = configurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);
                    foreach (CatalogNode collectionNode in collectionNodes)
                    {
                        Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
                        TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);
                        Console.WriteLine("Collection: " + teamProjectCollection.Name);
                        var projectNodes = collectionNode.QueryChildren(new[] { CatalogResourceTypes.TeamProject }, false, CatalogQueryOptions.None);
                        foreach (CatalogNode projectNode in projectNodes)
                        {
                            Console.WriteLine(" Team Project: " + projectNode.Resource.DisplayName);
    
                            var store = teamProjectCollection.GetService<WorkItemStore>();
                            if (store != null)
                            {
                                var wiq = "SELECT * FROM WorkItems where [System.TeamProject]=@teamProject";
                                Dictionary<string, string> values = new Dictionary<string, string>();
                                values.Add("teamProject", projectNode.Resource.DisplayName);
                                Query query = new Query(store, wiq, values);
                                int count = query.RunCountQuery();
                                if (count > 0)
                                {
                                    var results = query.RunQuery();
                                    foreach (WorkItem item in results)
                                    {
                                        Console.WriteLine(item.Title + "\t" + item.Description);
                                        //更新したい場合
                                        //item.Open();
                                        //item.Description += "あいうえお";
                                        //item.Save();
                                    }
                                }
                            }
                        }
                    }
                }
                Console.WriteLine("*** End ***");
                Console.ReadLine();
            }
        }
    }
    
    #あくまでもできるということだけで、負荷のかかることを勧めてるわけではありません

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク ruirui-ri 2015年12月28日 5:24
    2015年12月27日 16:29

すべての返信

  • こんにちは。

    右上の「Search work items」検索ボックスのことですか?

    なるほど。検索ボックスを活用していなかったので気づきませんでした。
    仰っているようにおそらく単語区切りが意識されている感じですかね。

    Example search box queries

    ピンポイントで検索対象がわかるのであれば、対象を指定しつつ曖昧にすることでしょうか。

    例「"Title":あいうえお」


    2015年12月19日 7:25
    モデレータ
  • > 右上の「Search work items」検索ボックスのことですか?

    はい、その通りです。
    様々な情報を蓄積されるとナレッジ的に検索したいのですが、それがかなわず、現在のプロジェクトでこのまま Visual Studio Online を継続利用すべきかどうか?という議論になっています。

    >例「"Title":あいうえお」

    この方法ならタイトル限定になりますが、ブランクで区切られていなくても検索できました。
    ありがとうございます!

    このヒントで気づいたのですが、検索ボックスで任意の単語で検索した後に、画面上部の [Editor] をクリックします。

    

    すると、次のようなクエリー編集画面になります。

    Operator は "Contains Words" ですが、Title だけは Contains に変更できます。
    ですが、教えていただいた方法で検索をすると、Operator は 次のようにbContains になり、単語の区切りがどうあれ検索できます。


    ならば、
    Description なども同じく Contains すれば良い!と思ったのですが、残念ながら Contains は選べず
    Contains Words しか選べないんです。おそらく、ここが改善されればいいのですが。。。

    2015年12月21日 0:54
  • たしかにDescriptionは選べませんね…。

    ちなみにオンプレの日本語TeamFoundationServer2013で確認してみたところ、Descriptionも曖昧検索の対象となっていました。
    (というか"Title":の指定も不要)

    もしかすると、VSTSの「英語」という制限内なのかもしれませんね…。
    その活用方法からいうと確かに不便ですね。

    何か解決方法があると良いですが。

    2015年12月21日 1:24
    モデレータ
  • オンプレ版ではあいまい検索ができるんですね。おっしゃる通り根本的に英語のプラットフォームで動いているが故の制限ですね。

    この機能は個人的にですが非常に重要な機能にもかかわらず、ネットで探し回ってもこの問題はでてきません。もしかすると、日本において Visual Studio Online を活用している方は思ったより少ないのかもしれません。逆の見方をすると、この辺りが至らないので利用する方が少ないのかなぁと思ったりします。

    これ以外の機能では全くが不満がないので残念です。ぜひ、マイクロソフトさんにはこの辺りを頑張って欲しいです。


    2015年12月21日 6:04
  • この件もう少し調べてみたんですが、やはり Team Service では現場対応は難しいのかもしれません。

    以下のページにこんなことが書いてありました。

    https://msdn.microsoft.com/ja-jp/library/dd286638.aspx?f=255&MSPPError=-2147217396#full_text

    [語を含む] と [語を含まない] では、長いテキスト フィールドに対して作成されたフルテキスト検索インデックスに基づいて項目がフィルター処理されます。 Team Foundation では、データ型が PlainText と HTML のすべての長いテキストのフィールド、および [タイトル] フィールドに対し、フルテキスト検索用のインデックスを自動的に設定します。 インデックスと演算子は、Team Foundation Server をサポートする SQL Server でフルテキスト検索がサポートされている場合にのみ使用できます。

    フルテキスト検索では、SQL Server にワード ブレーカーが登録されている言語に対応する SQL 照合順序が必要です。 Team Foundation Server インスタンスで使用されているチーム プロジェクト コレクション データベースの照合順序の設定が、サポートされている言語に応じたものでないと、検索結果が期待どおりにならないことがあります。 このような場合は、[次の値を含む] 演算子または [次の値を含まない] 演算子を試すことができます。

    要は SQL Server 側の設定が必要なようで、これからこれを Team Service で対応するのは困難かもしれません。
    少なくとも利用者側からはアンタッチャブルな領域で、解決はできません。


    2015年12月24日 6:56
  • Webで完結しなくてもいいなら直接アクセスする手段は提供されているので、全文取り出してローカルで抽出するとか。
    VisualStudioの上位版を持っていると自動でインストールされるアセンブリもnugetで得られるみたいです。
    とりあえずのアクセスできることしか試せてませんがRESTでも可能っぽいのでJavascriptで引っ張ってこればwebでも完結させられないこともないかも

    using System;
    using System.Net;
    using System.Collections.Generic;
    using Microsoft.TeamFoundation.Client;
    using Microsoft.TeamFoundation.Framework.Common;
    using Microsoft.TeamFoundation.Framework.Client;
    using Microsoft.TeamFoundation.WorkItemTracking.Client;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Uri tfsUri = new Uri("https://********.visualstudio.com/");
                UICredentialsProvider pr = new UICredentialsProvider();
                var cre = CredentialCache.DefaultNetworkCredentials;
                using (var configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri))
                {
                    //HKCU\Software\Microsoft\VSCommon\14.0\ClientService\TokenStrage\VisualStudio\VssApp
                    var collectionNodes = configurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);
                    foreach (CatalogNode collectionNode in collectionNodes)
                    {
                        Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
                        TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);
                        Console.WriteLine("Collection: " + teamProjectCollection.Name);
                        var projectNodes = collectionNode.QueryChildren(new[] { CatalogResourceTypes.TeamProject }, false, CatalogQueryOptions.None);
                        foreach (CatalogNode projectNode in projectNodes)
                        {
                            Console.WriteLine(" Team Project: " + projectNode.Resource.DisplayName);
    
                            var store = teamProjectCollection.GetService<WorkItemStore>();
                            if (store != null)
                            {
                                var wiq = "SELECT * FROM WorkItems where [System.TeamProject]=@teamProject";
                                Dictionary<string, string> values = new Dictionary<string, string>();
                                values.Add("teamProject", projectNode.Resource.DisplayName);
                                Query query = new Query(store, wiq, values);
                                int count = query.RunCountQuery();
                                if (count > 0)
                                {
                                    var results = query.RunQuery();
                                    foreach (WorkItem item in results)
                                    {
                                        Console.WriteLine(item.Title + "\t" + item.Description);
                                        //更新したい場合
                                        //item.Open();
                                        //item.Description += "あいうえお";
                                        //item.Save();
                                    }
                                }
                            }
                        }
                    }
                }
                Console.WriteLine("*** End ***");
                Console.ReadLine();
            }
        }
    }
    
    #あくまでもできるということだけで、負荷のかかることを勧めてるわけではありません

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク ruirui-ri 2015年12月28日 5:24
    2015年12月27日 16:29
  • gekka さん

    貴重な情報をありがとうございます。
    頂いたコードを元に簡単なアプリを作成したところ、思った通りの検索ができました!
    Webで完結できないのは残念ですが、これで当面は運用できそうです。

    よもやプログラムでこのような操作ができるとは思いもしませんでした。もっといろいろな活用方法がありそうですね。
    もっと勉強してみようと思います。


    • 編集済み ruirui-ri 2016年1月4日 8:29
    2015年12月28日 5:26
  • 今更ですが、VSTSのWork Item検索機能がパブリックプレビューになりました。

    試してみたところ、結構いける感じです。試してみてください

    https://blogs.msdn.microsoft.com/visualstudioalm/2016/11/16/announcing-public-preview-for-work-item-search/


    Thanks, K.Kamegawa (http://kkamegawa.hatenablog.jp/)

    2016年11月19日 0:01