أسرع طريقة للحصول على قيم مميزة من لوسين سؤال

StackOverflow https://stackoverflow.com/questions/618227

  •  03-07-2019
  •  | 
  •  

سؤال

وحاليا أفعل مثل هذا:

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();

وكما ترون، وأنا أول جمع كل المجالات (عدة آلاف) ثم متميزة لهم، وربما تخطي بعض واتخاذ بعض خارجا.

وأشعر يجب أن يكون هناك طريقة أفضل للقيام بذلك.

هل كانت مفيدة؟

المحلول

ولست متأكدا من هناك، وبصراحة، كما لوسين لا توفر وظائف "متميزة". أعتقد مع المؤسسة العامة يمكنك استخدام بحث وجه لتحقيق ذلك، ولكن إذا كنت تريد هذا في لوسين، وكنت قد لكتابة نوعا من وظيفة الوجه نفسك. لذلك طالما أنك لا تعمل في أي مشكلات في الأداء، يجب أن تكون على ما يرام بهذه الطريقة.

نصائح أخرى

وربط هذا السؤال إلى سؤال سابق لك (إعادة: "الكثير من بنود")، أعتقد يجب عليك بالتأكيد أن تبحث في تعداد المدى من القارئ مؤشر. ذاكرة التخزين المؤقت النتائج (أنا استخدم القاموس فرزها مرتبطا على اسم الحقل، مع قائمة المصطلحات كما يتضح من البيانات، إلى الحد الأقصى من 100 مصطلح في الميدان) حتى القارئ مؤشر يصبح غير صالح وتذهب بعيدا.

وأو ربما يجب أن أقول، أنه عندما تواجه مشكلة مماثلة ليدكم، وهذا ما فعلته.

ويساعد هذا الأمل،

وأنا أقترح عليك أن تجد منطق لتخطي هذا النوع من التكرار ولكن إذا لم يكن هناك حل في السياق الخاص بك، ثم يمكنك الحصول على كسب الأداء مع رمز
التالية 1) في وقت مؤشر فمن الأفضل لوضع الحقل الذي تريد تكرار، في الحقل الأول

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

2) ثم تحتاج إلى تحديد FieldSelector مثل هذا

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