2014-05-16 3 views
0

ServiceStack에서 개발 된 API에서 검색 기능을 구현하기로 결정했습니다. Lucene.Net을 사용하기로 결정한 것은 검색을 위해 훌륭한 인덱서라고 들었 기 때문입니다.Lucene.Net을 사용하여 Azure Storage 폴더에 액세스 할 수 없음

우리는 Azure Storage 폴더에 색인을 생성하는 작업자 역할을 만들었으며 우리는 Leon Cullen's tutorial을 사용하여 지침을 작성했습니다. 우리는 해당 게시물에 지정된 을 사용하므로 최신 Azure SDK를 사용할 수 있습니다.

그런 다음 우리의 API 프로젝트에서 우리는 Lucene.Net 및 AzureDirectory에 대한 참조를 추가하는 것은 너무 우리의 엔드 포인트는 다음과 같이 찾고 결국 우리가 로컬이를 실행하면 예상대로

public object Post(SearchIndex request) 
    {   

     List<Product> products = new List<Product>(); 

     var pageSize = -1; 
     var totalpages = -1; 
     int.TryParse(ConfigurationManager.AppSettings["PageSize"], out pageSize); 

     if (request.Page.Equals(0)) 
     { 
      request.Page = 1; 
     } 

     // Get Azure settings 
     AzureDirectory azureDirectory ; 

     try 
     { 
      // This is the line where we get the Access denied exception thrown at us 
      azureDirectory = new AzureDirectory(Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(ConfigurationManager.AppSettings["ConnectionStringAzureSearch"]), "indexsearch"); 

      IndexSearcher searcher; 
      using (new AutoStopWatch("Creating searcher")) 
      { 
       searcher = new IndexSearcher(azureDirectory); 
      } 

      using (new AutoStopWatch(string.Format("Search for {0}", request.SearchString))) 
      { 
       string[] searchfields = new string[] { "Id", "Name", "Description" }; 

       var hits = searcher.Search(QueryMaker(request.SearchString, searchfields), request.Page * pageSize); 

       int count = hits.ScoreDocs.Count(); 
       float temp_totalpages = 0; 
       temp_totalpages = (float)hits.ScoreDocs.Count()/(float)pageSize; 

       if (temp_totalpages > (int)temp_totalpages) 
       { 
        totalpages = (int)temp_totalpages + 1; 
       } 
       else 
       { 
        totalpages = (int)temp_totalpages; 
       } 

       foreach (ScoreDoc match in hits.ScoreDocs) 
       { 
        Document doc = searcher.Doc(match.Doc); 

        int producId = int.Parse(doc.Get("Id")); 

        Product product = Db.Select<Product>("Id={0}", producId).FirstOrDefault(); 

        products.Add(product); 
       } 

      } 

      return new SearchIndexResult { result = products.Skip((int)((request.Page - 1) * 10)).Take(pageSize).ToList(), PageSize = pageSize, TotalPages = totalpages }; 
     } 
     catch (Exception e) 
     { 

      return new HttpResult(HttpStatusCode.NoContent, "azureDirectory. Parameter: " + request.SearchString + ". e: " + e.Message); 
     } 



    } 

그것은 우리에게 결과를 반환 작품 우리는 기대하고 있었다. 그러나 Azure에 API를 게시하고 검색 끝점에 액세스하려고 시도했을 때 '경로에 대한 액세스'D :/AzureDirectory 메시지가 거부 된 403 오류 메시지가 수신되었습니다.

왜 그런 폴더에 접근하려고 시도하고 있는데, 폴더의 이름이 잘못되어 로컬 경로에 액세스하려고 시도하는 것 같아요. 왜 로컬에서는 제대로 작동합니까?하지만 일단 Azure에 배포되면 작동을 멈 춥니 다.

작업자 역할은 문제없이 실행되지만 Azure 저장소의 폴더에 액세스 할 수없는 API 측이 있습니다. 구성에 중요한 단계가 빠졌습니까? 다음 지침은 사용하는 초보자에게 분명하지 않습니다. Lucene.Net 또는 Azure Storage를 사용하면 중요한 단계를 놓쳤을 수도 있습니다. 우리 연결 문자열을 cked 모든 게 괜찮아 보인다.

+0

결론에 도달 했습니까? 임씨는 비슷한 종류의 문제가 있습니다. 내 클라우드 서비스에서 색인을 생성 할 수 있으며 내 웹 API를 로컬에서 실행할 때 예상대로 읽을 수는 있지만 하늘색 웹 사이트에서 실행하면 문제가 발생합니다.것은 일하는 데 사용되는 것이므로 일부 업데이 트와 관련이 있다고 생각합니다. –

답변

0

나는 그것을 작동시켰다.

  • GitHub에서 최신 버전의 AzureDirectory를 얻었습니다.
  • Azure Storage 등에 최신 nuGet 패키지가 있습니다.
  • 인덱스를 재생성했습니다. 참조에 관해서는
1

: https://github.com/azure-contrib/AzureDirectory/blob/master/AzureDirectory/AzureDirectory.cs

당신이 사이트 루트에 해당 디렉토리를 가질 수 있습니다에 대한이

azureDirectory = new AzureDirectory(Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(ConfigurationManager.AppSettings["ConnectionStringAzureSearch"]), "indexsearch"); 

var cachePath = Path.Combine(Path.GetPathRoot(Environment.SystemDirectory), "AzureDirectory"); 
var azureDir = new DirectoryInfo(cachePath); 
if (!azureDir.Exists) 
    azureDir.Create(); 

var catalogPath = Path.Combine(cachePath, _containerName); 
var catalogDir = new DirectoryInfo(catalogPath); 
if (!catalogDir.Exists) 
    catalogDir.Create(); 

_cacheDirectory = FSDirectory.Open(catalogPath); 

그래서 간단한 솔루션을 실행 할

DirectoryInfo info = new DirectoryInfo(HostingEnvironment.MapPath("~/")); 
azureDirectory = new AzureDirectory(storageAccount, containerName, new SimpleFSDirectory(info), true); 
0

나는 자신의 해결책을 시도했지만 마지막 매개 변수 bool compressBlob = false 그는 내 로컬 디버그가 AzureDirectory 라이브러리에서 404 예외로 실패하고 내가 게시했을 때 실패했습니다. Azure 웹 응용 프로그램에는 메시지 System.IO.InvalidDataException: Block length does not match with its complement 예외가있었습니다.

나는 마지막 매개 변수를 생성자에서 제거했으며 모든 것은 매력처럼 작동합니다. 희망이 누구도 도움이됩니다.