2010-03-25 40 views
0

我一直在使用NHibernate,NHibernate.Search和Lucene.Net來改進在我開發的網站上使用的搜索引擎。Manipulate在NHibernate的查詢結果上的得分/排名。搜索

基本上,我用它來搜索企業規範文檔的內容。這不會與Lucene的文檔概念相混淆:就我而言,規範文檔(我將在後面稱爲「specdoc」)可以包含很多頁面,這些頁面的內容實際上是索引的(因此,頁面本身就屬於Lucene的文檔概念)。所以,這些頁面屬於一個specdoc,而specdoc又屬於一個公司(所以,一個公司可以有很多specdocs)。我使用NHibernate.Search「IndexEmbedded」和「ContainedIn」屬性將頁面與它們的specdoc和specdocs關聯到它們的公司,所以我可以在specdoc頁面中查詢術語並使Lucene/NH.Search自己返回頁面,specdocs或符合頁面查詢的公司。我可以通過這種方式進行查詢並獲得排名結果,從而根據相關性呈現結果(即公司,specdoc或頁面),這非常棒。

但現在我需要更多。特別是在我查詢條款並且讓NH.Search返回匹配的公司時,我需要手動/人工調整某些結果的分數,因爲有些公司想要顯示在結果的頂部設置 - 想想「贊助的結果」。

我正在考慮在我的應用程序上這樣做,可能是創建一個包含與公司實體關聯的實體/數據庫表,並提高分數值。但我不知道如何將這些信息提供給Lucene,並在搜索時相應地提高搜索結果。最初,我想過要派生一個相似類來做到這一點,但它看起來並不像相似性可以用來在搜索時修改結果集。根據this page,它看起來像我需要的是混亂的重量或得分。但是文檔有點膚淺,因爲沒有關於如何實現自定義評分的示例,更不用說將它與NH.Search集成。

那麼,有沒有人知道如何做到這一點,或指向我的一些文件或工作示例如何做類似的事情?

謝謝!

回答

0

從我的理解,你只是想能夠在查詢時間,而不是索引時間設置提升。這可以很容易地完成。當你建立你的查詢時,你可以設置提升。 Query對象包含一個SetBoost屬性,它允許您提升與整個查詢匹配的文檔。當你使用兩個術語查詢並且你想讓他們中的一個被提升時這很有用。但是,如果您正在使用QueryParser之類的功能來構建查詢,則查詢解析器會爲查詢條件設置提示語法。更多關於這裏的信息http://lucene.apache.org/java/2_9_0/queryparsersyntax.html#Boosting%20a%20Term。現在,如果您使用的是查詢解析器,則可以使用一些正則表達式或調整查詢解析器字符串以添加附加符號來增加一個術語,或者您可以查看創建您自己的查詢解析器,它會在決定時添加提升它必須被添加。我創建了自己的查詢解析器,因爲它並不困難。這裏有一些關於這方面的信息http://openedu.ossreleasefeed.com/tutorials/apache-lucene-extending-the-queryparser/

+0

是的,我想調整查詢以獲得我需要的結果,但我不能這樣做,至少我不知道如何。這裏的交易是:我的商店/索引,以及specdoc頁面的文本內容,specdocs和與內容相關的公司的ID。所以,如果我查詢這樣的內容: SpecDoc.Pages.content:white AND SpecDoc.CorpID:32 它返回的公司內容中包含「white」的specdoc頁面,僅限於ID爲32的公司。 – 2010-03-28 22:21:18

+0

Now ,由此推斷,這將接近我需要的行爲: SpecDoc.Pages.content:white或SpecDoc。公司身份證號碼:64^100 - 但這顯然不是我所需要的:即使他們的網頁不包含「白色」,它也會帶來ID 64的公司的業績,並提升到100。 – 2010-03-28 22:25:10

+0

我需要的是隻有當他們的頁面包含「白色」時,才能在CorpID上進行分數提升,否則它們不應該顯示在結果上。現在,無論我對Lucene查詢語法的理解是否缺乏(我的參考文獻已經是您發佈的頁面),或者我需要其他東西。我沒有時間仔細閱讀你的博客文章,所以稍後我會看看它,看看它是否有用。謝謝! – 2010-03-28 22:26:21