سؤال

أعمل على شبكة الإنترنت على أساس البحث عن وظيفة التطبيق باستخدام لوسين.المستخدم على موقعي في البحث عن عمل والتي هي داخل دائرة نصف قطرها 100 ميل من "بوسطن,MA" أو أي مكان آخر.أيضا, أنا بحاجة إلى إظهار نتائج البحث مرتبة حسب "صلة"(أي.النتيجة التي تم إرجاعها بواسطة لوسين) في ترتيب تنازلي.

أنا باستخدام 3rd الطرف API لجلب جميع المدن داخل دائرة نصف قطرها معينة من المدينة.هذا API لي حوالي 864 المدن داخل دائرة نصف قطرها 100 ميل من "بوسطن,MA".

أنا بناء المدينة/الدولة لوسين الاستعلام باستخدام المنطق التالي الذي هو جزء من "BuildNearestCitiesQuery" الأسلوب.هنا nearestCities هو hashtable عاد أعلاه API.أنه يحتوي على 864 المدن مع CityName الحمار مفتاح StateCode القيمة.و finalQuery هو لوسين BooleanQuery الكائن الذي يحتوي على معايير البحث الأخرى التي تم إدخالها من قبل المستخدم مثل:مهارات,الكلمات الرئيسية,الخ.

foreach (string city in nearestCities.Keys)

{

    BooleanQuery tempFinalQuery = finalQuery;

    cityStateQuery = new BooleanQuery();    

    queryCity = queryParserCity.Parse(city);

    queryState = queryParserState.Parse(((string[])nearestCities[city])[1]);

    cityStateQuery.Add(queryCity, BooleanClause.Occur.MUST); //must is like an AND

    cityStateQuery.Add(queryState, BooleanClause.Occur.MUST);

} 


nearestCityQuery.Add(cityStateQuery, BooleanClause.Occur.SHOULD); //should is like an OR



finalQuery.Add(nearestCityQuery, BooleanClause.Occur.MUST);

ثم إدخال finalQuery كائن إلى لوسين البحث عن طريقة للحصول على جميع الوظائف داخل دائرة نصف قطرها 100 ميل.:

searcher.Search(finalQuery, collector);

اكتشفت هذا BuildNearestCitiesQuery الطريقة تأخذ ضخم 29 ثانية في المتوسط لتنفيذ والتي من الواضح هو غير مقبول من قبل أي معايير من موقع على شبكة الإنترنت.كما تبين أن البيانات التي تنطوي على "تحليل" يستغرق قدرا كبيرا من الوقت لتنفيذ بالمقارنة مع غيرها من البيانات.

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

هل هناك أي طريقة يمكنني تحسين هذا المنطق ؟ أو لتلك المسألة بلدي النهج كله/خوارزمية من أجل إيجاد جميع الوظائف على بعد 100 ميل باستخدام لوسين?

لمعلوماتك هنا هو كيف الفهرسة في لوسين تبدو مثل:

doc.Add(new Field("jobId", job.JobID.ToString().Trim(), Field.Store.YES, Field.Index.UN_TOKENIZED));

doc.Add(new Field("title", job.JobTitle.Trim(), Field.Store.YES, Field.Index.TOKENIZED));

doc.Add(new Field("description", job.JobDescription.Trim(), Field.Store.NO, Field.Index.TOKENIZED));

doc.Add(new Field("city", job.City.Trim(), Field.Store.YES, Field.Index.TOKENIZED , Field.TermVector.YES));

doc.Add(new Field("state", job.StateCode.Trim(), Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.YES));

doc.Add(new Field("citystate", job.City.Trim() + ", " + job.StateCode.Trim(), Field.Store.YES, Field.Index.UN_TOKENIZED , Field.TermVector.YES));

doc.Add(new Field("datePosted", jobPostedDateTime, Field.Store.YES, Field.Index.UN_TOKENIZED));

doc.Add(new Field("company", job.HiringCoName.Trim(), Field.Store.YES, Field.Index.TOKENIZED));

doc.Add(new Field("jobType", job.JobTypeID.ToString(), Field.Store.NO, Field.Index.UN_TOKENIZED,Field.TermVector.YES));

doc.Add(new Field("sector", job.SectorID.ToString(), Field.Store.NO, Field.Index.UN_TOKENIZED, Field.TermVector.YES));

doc.Add(new Field("showAllJobs", "yy", Field.Store.NO, Field.Index.UN_TOKENIZED));

شكرا جزيلا لك على القراءة!أقدر لك مساعدتك في هذا.

جانيس

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

المحلول

لست متأكدا إذا أنا أفهم تماما التعليمات البرمجية الخاصة بك, ولكن عندما يتعلق الأمر الجغرافية المكانية البحث عن مرشح النهج قد يكون أكثر ملاءمة.ربما هذا الرابط يمكن أن تعطي لك بعض الأفكار http://sujitpal.blogspot.com/2008/02/spatial-search-with-lucene.html

ربما يمكنك استخدام فلترs على أجزاء أخرى من الاستعلام الخاص بك وكذلك.أن نكون صادقين الاستعلام الخاص بك تبدو معقدة جدا.

--هاردي

نصائح أخرى

وبصرف النظر عن tempFinalQuery كونها غير ضرورية خريطة البحث للحصول على الدولة هناك لا يبدو أن يكون أي شيء أكثر فظاعة في قانون آخر.وبصرف النظر عن التنسيق...

إذا في كل وقت في Parse أساليب نشر التعليمات البرمجية الخاصة بهم هنا من شأنه أن يجعل الشعور.

أنا قد غاب عن نقطة السؤال الخاص بك ولكن لديك إمكانية تخزين خطوط الطول والعرض على رموز البريدي ؟ إذا كان هذا هو الخيار ، ومن ثم يمكن حساب المسافة بين الإحداثيات توفير أكثر وضوحا التهديف متري.

أعتقد أن أفضل نهج هو نقل أقرب مدينة تقرير إلى تصفية البحث.وأود أيضا أن تعيد النظر في كيفية أن يكون لديك مجال إعداد;النظر في إنشاء مصطلح واحد له المدينة+الدولة بحيث يسهل الاستعلام.

أقترح:

  • تخزين خطوط الطول والعرض من المواقع كما أنها تأتي في
  • عندما يدخل المستخدم مدينة المسافة تتحول إلى lat/lon قيمة درجة
  • فعل واحد ، بحث بسيطة على أساس العددية المسافة lat/lon مقارنات

يمكنك مشاهدة مثال على كيف يعمل هذا في جيو::المسافة Perl module.نلقي نظرة على closest طريقة في المصدر, الذي ينفذ هذا البحث عن طريق SQL بسيطة.

أتفق مع الآخرين هنا أن هذه الروائح كثيرا.كما تفعل النصية البحث على المدينة أسماء ليست دائما موثوقة.غالبا ما يكون هناك قليلا من الموضوعية بين أسماء الأماكن (وخاصة المناطق داخل المدينة التي قد تكون في حد ذاتها تكون كبيرة).

القيام الجغرافية المكانية الاستعلام هو الطريق للذهاب.لا يعرفون بقية إعداد فمن الصعب أن ننصح.لديك المكانية دعم صلب بطلاقة إلى NHibernate و SQL Server 2008 على سبيل المثال.ثم هل يمكن القيام بعملية بحث جدا بسرعة وكفاءة.بيد أن التحدي الخاص بك هو الحصول على هذا العمل ضمن لوسين.

يمكن أن تفعل "أولا تمرير" الاستعلام باستخدام المكانية الدعم في SQL Server ثم قم بتشغيل تلك النتائج من خلال لوسين?

الرئيسية الأخرى تستفيد من القيام المكانية الاستفسارات هو أنه يمكنك بسهولة فرز النتائج حسب المسافة وهو الفوز للعملاء الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top