문제

현재 나는 이것을 좋아한다 :

IndexSearcher searcher = new IndexSearcher(lucenePath);
Hits hits = searcher.Search(query);
Document doc;
List<string> companyNames = new List<string>();

for (int i = 0; i < hits.Length(); i++)
{
    doc = hits.Doc(i);
    companyNames.Add(doc.Get("companyName"));
}
searcher.Close();

companyNames = companyNames.Distinct<string>().Skip(offSet ?? 0).ToList();
return companyNames.Take(count??companyNames.Count()).ToList();

보시다시피, 나는 먼저 모든 필드 (수천)를 수집 한 다음 구별하여 일부를 건너 뛰고 일부를 꺼내는 것입니다.

더 나은 방법이 있어야한다고 생각합니다.

도움이 되었습니까?

해결책

루센이 '별개의'기능을 제공하지 않기 때문에 솔직히 말해서 확실하지 않습니다. 나는 Solr로 패싯 검색을 사용하여이를 달성 할 수 있다고 생각하지만, Lucene에서 이것을 원한다면, 당신은 일종의 패싯 기능을 직접 작성해야 할 것입니다. 성능 문제가 발생하지 않는 한 이런 식으로 괜찮을 것입니다.

다른 팁

이 질문을 귀하의 이전 질문 (Re : "너무 많은 조항")에 묶는 것은 인덱스 리더의 용어 열거를 분명히보고 있어야한다고 생각합니다. 인덱스 리더가 유효하지 않고 멀리 갈 때까지 결과를 캐시 (필드 이름으로 데이터로서 용어 목록과 필드 당 최대 100 용어로 사용했습니다).

또는 아마도 나는 당신과 비슷한 문제에 직면했을 때 그것이 내가 한 일이라고 말해야합니다.

도움이 되었기를 바랍니다,

이런 종류의 반복을 건너 뛰는 논리를 찾는 것이 좋습니다. 그러나 상황에 해결책이 없다면 다음 코드로 성능을 얻을 수 있습니다.
1) 색인 시간에 반복하고 싶은 필드를 제 1 필드에서 배치하는 것이 가장 좋습니다.

Document doc = new Document();
Field companyField = new Field(...);
doc.Add(companyField);
...

2) 그런 다음 이와 같이 필드 선출자를 정의해야합니다.

class CompanyNameFieldSelector : FieldSelector
{
    public FieldSelectorResult Accept(string fieldName)
    {
        return (fieldName == "companyName" ? FieldSelectorResult.LOAD_AND_BREAK : FieldSelectorResult.NO_LOAD);
    }
}

3) 그런 다음이 필드를 반복하고 선택하고 싶을 때는 이와 같은 일을해야합니다.

FieldSelector companySelector = new CompanyNameFieldSelector();
// when you iterate through your index
doc = hits.Doc(i);
doc.Get("companyName", companySelector);

위의 코드의 성능은 귀하가 제공 한 코드보다 훨씬 낫습니다. 원인이 불필요한 문서 필드를 읽고 시간을 절약 할 수 있습니다.

public List<string> GetDistinctTermList(string fieldName)
    {
        List<string> list = new List<string>();

        using (IndexReader reader = idxWriter.GetReader())
        {
            TermEnum te = reader.Terms(new Term(fieldName));

            if (te != null && te.Term != null && te.Term.Field == fieldName)
            {
                list.Add(te.Term.Text);

                while (te.Next())
                {
                    if (te.Term.Field != fieldName)
                        break;
                    list.Add(te.Term.Text);
                }
            }
        }

        return list;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top