Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 9

0
votes
answers
122 views
+10

Solr如何存儲文件

0

我知道Solr使用Lucene和Lucene使用倒排索引。但從目前爲止我看到的Lucene例子中,我不確定我是否理解它與Solr的結合。Solr如何存儲文件

給出下列文件:

<doc> 
    <field name="id">9885A004</field> 
    <field name="name">Canon PowerShot SD500</field> 
    <field name="manu">Canon Inc.</field> 
    <field name="inStock">true</field> 
</doc> 

從到目前爲止,我所看到的例子,我認爲Lucene的具有對待每個字段作爲文檔。然後它會說:ord Cannon出現在字段name和字段manu中。

索引分解了多少?或者索引只是說:「佳能這個詞出現在id爲這樣的文件」?

如何在Solr中使用Lucene時如何工作? 該文件在索引中的外觀如何? (假設每個字段都有indexed="true"

+1

您可以[通過在2013年從Lucene的/ Solr的革命演示一個如何Lucene的存儲數據的詳細綱要(獲得https://www.slideshare.net/lucenerevolution/what -is-inaluceneagrandfinal)。我不確定它是否提到了DocValues,它是一個面向列的存儲,而不是常規的倒排索引,可以加速某些操作。 – MatsLindh

+0

@MatsLindh感謝您的信息! – user3813234

沙发
0
1

我幾年前發了一篇博文,詳細解釋一下[1]。

簡短回答了這個問題:「從我到目前爲止看到的例子,我認爲Lucene的具有對待每個字段的文檔」

絕對不是。 Lucene信息單元是由地圖字段 - >值[s]組成的文檔。 Solr文檔只是一個稍微不同的表示,因爲Solr在描述字段的地方包含模式。 因此,在Solr中,您只需將字段添加到文檔中,而無需描述類型和其他屬性(存儲在模式中),而在Lucene中,您需要在創建文檔時明確定義它們。

[1] https://sease.io/2015/07/26/exploring-solr-internals-the-lucene-inverted-index/

0
votes
answers
78 views
+10

在SearchManager中使用IndexWriter

0

關於SearcherManager在IndexWriter中的用法,我有幾個基本問??題。在SearchManager中使用IndexWriter

我需要定期在應用程序中重新構建Lucene索引,目前它發生在除提供搜索請求的線程以外的其他線程中。

  1. 我可以在應用程序的生命週期中使用相同的IndexWriter實例來定期重建索引嗎?目前,我在創業期間創建/打開一次,每當建立新索引時致電IndexWriter#commit
  2. 我正在使用SearcherManager來爲每個搜索請求獲取併發布IndexSearcher實例。在定期建立索引之後,我打算使用SearcherManager#maybeRefresh方法來刷新IndexSearcher實例.SearcherManager實例在啓動過程中也會創建一次,並且我打算徹底維護它。
  3. 在整個應用程序的整個生命週期中,我都沒有關閉IndexWriterSearcherManager

現在的問題,

  1. 如果我每一次我需要重建索引的時間創建一個新的IndexWriter,將SearcherManager#maybeRefresh能夠檢測到,這是一個新的IndexWriter實例?或者我需要使用新創建的IndexWriter創建一個新的SearcherManager?
  2. 什麼用IndexWriter創建SearcherManager例如,使用DirectoryReader或使用Directory創建它創造的區別吧?
沙发
0
1

這些問題的答案取決於你如何構建你的SearcherManager

如果您有DirectoryReader,從SearcherManager獲得的所有未來IndexSearchers將根據該讀者構造它,即所有搜索將從實例化SearcherManager的時間點提供結果。如果您將數據寫入索引/目錄並在之後運行SearcherManager.maybeRefresh(),讀卡器將不會更新,並且您的搜索結果將過期。

如果構建SearcherManager時使用IndexWriterSearcherManager.maybeRefresh()將更新SearcherManager的閱讀器(如果數據已被寫入器寫入並提交)。所有新近收購的IndexSearchers將會反映潛在指數的新狀態。

儘管經驗有限,我推薦使用後一種方法。它提供了一個非常簡單的方法來實現near-real-time searching:在應用程序啓動時,您創建一個IndexWriter並用它構造一個SearcherManager。之後,您將開始一個後臺線程,該線程定期提交IndexWriter中的所有更改並刷新SearcherManager。對於應用程序的生命週期,您可以繼續使用初始的IndexWriter和SearcherManager,而無需關閉/重新打開它們。


PS:我纔開始使用Lucene工作前幾天,所以不要採取一切,我在這裏寫下的100%確定。

0
votes
answers
98 views
+10

elasticsearch vs solr - 用於自定義全文搜索系統

0

我有一個基於Lucene索引的內部創建的搜索引擎的Web應用程序。elasticsearch vs solr - 用於自定義全文搜索系統

該應用程序允許全文搜索。

該應用程序使用jsp和java構建。

爲用戶索引Hadoop分佈式處理軟件。

Apache lucene項目是根據我們的具體情況定製的。主要是全文搜索的部分,添加訂購結果的新功能。

前端使用hadoop-rpc與後端進行通信,後者又創建了一個內部解決方案(10年前),用於研究Lucene的未知事件。

該代碼是遺留的,它需要遷移到另一種類型的軟件。這裏的問題:ElasticSearchSolr

的要求是:

  • 開源的,目的是爲了自定義接受特定功能的應用程序的排名 。
  • 使用Lucene索引(因爲你 不想重新索引)。
  • 速度是非常重要的因素。

我已閱讀了一些關於這個主題的文章,但我想爲我的個案提供個性化的意見,任何想法哪一個將是最好的選擇?

謝謝

+0

兩者都可以很好地工作。哪種方法最好,取決於超出可以在這裏描述的因素以及您的詳細信息要求,但通常這對兩個平臺都是「足夠好」。無論如何,他們都是Lucene。 – MatsLindh

+0

請參考此問題:https://stackoverflow.com/questions/10213009/solr-vs-elasticsearch?rq=1 – Val

沙发
0
0

SolR和Elasticsearch非常相似。他們都有你需要的功能。

這是一個非常開放的問題,我的觀點是Elasticsearch將是一個更好的選擇,它有一個更大的社區,並且往往會增長得更快。

enter image description here

板凳
0
0

定製更多您需要的解決方案是,你就越有可能會從Solr的受益。

雖然他們都使用Lucene的封面,但Solr直接暴露了更多。 Elasticsearch針對日誌和事物進行了更多調整,一些文本搜索配置更難以訪問。

+0

好吧,我明白了。哪一個有最好的技術支持?最好的代碼可以定製?從我看到的都有一個很好的在線社區,但哪一個更適合定製搜索引擎? – lucy

+0

Solr具有更好的定製性,因爲絕對一切都是開源的。彈性可能有更好的支付。免費支持,我不知道。 –

117
votes
answers
80 views
+10

可搜索的數千個文檔存檔的最佳實踐(pdf和/或xml)

重新審視一個停滯不前的項目,並尋求建議,使數千個“舊”文檔現代化,並通過網絡提供。

文檔以各種格式存在,有些已過時:(。docPageMaker,硬拷貝(OCR),PDF等)。資金可用於將文檔遷移到“現代”格式,並且許多硬拷貝已經被OCR轉換為PDF格式 - 我們原先假設PDF將是最終格式,但我們願意接受建議(XML?) 。

一旦所有文檔都採用通用格式,我們希望通過Web界面提供其內容並進行搜索我們希望能夠靈活地返回整個文檔中找到搜索“命中”的部分(頁面?)(我相信Lucene / elasticsearch使這成為可能嗎?!?)如果內容全部是XML,那麼它可能更靈活嗎?如果是這樣,如何/在哪裡存儲XML?直接在數據庫中,還是作為文件系統中的離散文件?如何在文檔中嵌入圖像/圖形?

好奇其他人如何接近這一點。沒有“錯誤”的答案我只是在尋找盡可能多的輸入來幫助我們繼續前進。

謝謝你的建議。

up vote 113 down vote accepted favorite
沙发
+1130
+50

總結:我將推薦ElasticSearch,但讓我們解決問題,並討論如何實現它:

這有幾個部分:

  1. 從文檔中提取文本以使其可索引
  2. 將此文本作為全文搜索提供
  3. 返回文檔的突出顯示的片段
  4. 知道文檔中的哪些片段被發現允許分頁
  5. 返回完整的文檔

ElasticSearch可以提供什麼:

  1. ElasticSearch(如Solr)使用Tika從各種doc 格式中提取文本和元數據
  2. 很明顯,它提供了強大的全文搜索功能。它可以配置為使用適當的語言分析每個文檔,阻止,提高某些字段的相關性(例如標題比內容更重要),ngrams等,即標準Lucene的東西
  3. 它可以為每個搜索結果返回突出顯示的片段
  4. 它不知道你的文檔中出現這些片段的位置
  5. 它可以將原始文檔存儲為附件,也可以存儲和返回提取的文本。但它會返回整個文檔,而不是頁面。

您可以將整個文檔作為附件發送到ElasticSearch,然後您將獲得全文搜索。但關鍵點在於上面的(4)和(5):知道你在doc中的位置,以及返回doc的部分內容。

存儲單個頁面可能足以滿足您的“我在哪裡”的目的(儘管您可以同樣地進入段落級別),但是您希望它們按照在搜索結果中返回文檔的方式進行分組,即使搜索關鍵字出現在不同的頁面上。

首先是索引部分:將您的文檔存儲在ElasticSearch中:

  1. 使用Tika(或任何您熟悉的)從每個文檔中提取文本。將其保留為純文本或HTML,以保留一些格式。(忘記XML,不需要它)。
  2. 還提取每個文檔的元數據:標題,作者,章節,語言,日期等
  3. 將原始文檔存儲在文件系統中,並記錄路徑以便以後可以提供
  4. 在ElasticSearch中,索引一個“doc”doc,其中包含所有元數據,可能還包含章節列表
  5. 將每個頁面索引為“頁面”文檔,其中包含:

    • 父字段,其包含的“doc”文檔的ID(見“父-子關係”下方)
    • 文本
    • 頁碼
    • 也許是章節標題或編號
    • 您想要搜索的任何元數據

現在搜索。如何執行此操作取決於您希望如何按頁面顯示結果,或按文檔分組。

頁面結果很容易。此查詢返回匹配頁面的列表(每個頁面完整返回)以及頁面中突出顯示的片段列表:

curl -XGET 'http://127.0.0.1:9200/my_index/page/_search?pretty=1'  -d '
{
   "query" : {
      "text" : {
         "text" : "interesting keywords"
      }
   },
   "highlight" : {
      "fields" : {
         "text" : {}
      }
   }
}
'

顯示按“doc”分組的結果和文本中的突出顯示有點棘手。它不能通過單個查詢完成,但是一個小客戶端分組將幫助您。一種方法可能是:

步驟1:執行top-children-query以查找其子項(“page”)與查詢最匹配的父項(“doc”):

curl -XGET 'http://127.0.0.1:9200/my_index/doc/_search?pretty=1'  -d '
{
   "query" : {
      "top_children" : {
         "query" : {
            "text" : {
               "text" : "interesting keywords"
            }
         },
         "score" : "sum",
         "type" : "page",
         "factor" : "5"
      }
   }
}

第2步:從上面的查詢中收集“doc”ID並發出新查詢以從匹配的“頁面”文檔中獲取片段:

curl -XGET 'http://127.0.0.1:9200/my_index/page/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "query" : {
            "text" : {
               "text" : "interesting keywords"
            }
         },
         "filter" : {
            "terms" : {
               "doc_id" : [ 1,2,3],
            }
         }
      }
   },
   "highlight" : {
      "fields" : {
         "text" : {}
      }
   }
}
'

第3步:在您的應用中,按文檔對上述查詢的結果進行分組並顯示它們。

使用第二個查詢的搜索結果,您已經擁有了可以顯示的頁面的全文。要移至下一頁,您只需搜索它:

curl -XGET 'http://127.0.0.1:9200/my_index/page/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "and" : [
               {
                  "term" : {
                     "doc_id" : 1
                  }
               },
               {
                  "term" : {
                     "page" : 2
                  }
               }
            ]
         }
      }
   },
   "size" : 1
}
'

或者,給“頁面”文檔一個由$doc_id _ $page_num(例如123_2)組成的ID,然後您可以只檢索該頁面:

curl -XGET 'http://127.0.0.1:9200/my_index/page/123_2

親子關係:

通常,在ES(和大多數NoSQL解決方案)中,每個doc / object都是獨立的 - 沒有真正的關係。通過在“doc”和“page”之間建立父子關係,ElasticSearch確保子文檔(即“頁面”)與父文檔(“doc”)存儲在同一個分片上。

這使您可以運行top-children-query,它將根據“pages”的內容找到最匹配的“doc”。

好吧,我會說:“DrTech為總統!” ;-)很棒的答案!希望我能更多地投票。謝謝! - Meltemi 12年2月2日14:28

:)有趣的是,畢竟我的名字是克林頓:) - DrTech 12月2日在22:03

你不知道怎麼去索引PDF的每個“頁面”? - Meltemi 2012年6月14日22:51

Poppler工具poppler.freedesktop.org默認在大多數Linux發行版上都可用,非常快速且非常好。 - DrTech 2012年6月15日9:21

如果按頁面拆分,那麼您也可能無法找到分隔多個頁面的短語,不是嗎? - 結束於2015年4月27日凌晨4點21分

+20

我已經構建並維護了一個索引和搜索70k + PDF文檔的應用程序。我發現必須從PDF中提取純文本,將內容存儲在SQL中並使用Lucene索引SQL表。否則,表現太可怕了。

將內容存儲在數據庫中有什麼好處?是不是更容易提取內容(假設你不只是使用Solr並跳過手動處理),索引它,並丟棄純文本內容? - 戴夫牛頓2012年6月1日18:12

好吧......我不得不回去查看代碼。這就是我正在做的事情。首先,我必須說,我們有一個單獨的索引服務器來處理這個功能。以下是過程:1)從內容服務器上的PDF中提取文本2)使用類似的目錄/文件名將文本存儲在.txt文件中。3)索引文本文件。在搜索時,我們能夠根據文件路徑/命名將結果與原始PDF相關聯 - Josh Siok Jun於2012年1月1日18:26

我認為在這裡使用關係數據庫沒有任何好處。@Dave,一次更正,你不丟棄原始文本內容,你使用搜索引擎(Solr,ES,...)來索引和存儲它。然後,在搜索結果中,您只需顯示原始文件的鏈接。 - Marko Bonaci 12年4月4日11:36

我們這樣做有兩個原因。首先,整體索引時間更快。其次,數據庫中存在與每個文檔對應的相關數據,因此以這種方式構建完整索引更簡單。 - Josh Siok 6月4日在13:01

+20

使用SunspotRSolr等,它處理大多數主要文檔格式。他們使用Solr / Lucene。

在這種情況下,PDF格式的優缺點是什麼?在這個階段,我們可以選擇任何一種方式。我認為PDF最初可能更容易創建,但可能更難維護和“服務”?!?不知道。尋求建議。 - Meltemi 6月1日在18:26

@Meltemi我不知道PDF如何更難以服務; 文件是文件。XML文件需要格式化,您需要在所有格式之間進行轉換為xml。 - 戴夫牛頓2012年6月1日18:29

文件是文件,但我們希望一次只“提供”整個文檔的一部分。所以我想我們可以將每個PDF分解成數百個較小的PDF,它們開始變得笨拙。想知道XML是否可以使這一過程變得更加容易?!?也許不是。 - Meltemi 12年1月1日20:57

@Meltemi完全取決於; 在不知道具體要求的情況下,很難說。XML DB有點失寵。內容仍然需要格式化/轉換,這可能是您想要的簡單或複雜。根據您的需要,從原始源到XML的轉換可能是微不足道的,或者基本上是不可能的。可能最好使用大數據解決方案並完全刪除應用程序級別的文件 - 一個hBase行可以有數百萬個列,每個列包含一個段落或其他,每行都是一個單獨的doc。大量的解決方案。 - 戴夫牛頓2012年6月1日21:08

@ D.Newton - “大量的解決方案”。那就是我問這些問題的原因。我正在尋找想法。不嘗試挑邊。至於“要求”,它們與可能性,複雜性和成本相關聯。基本上我所知道的是,我們希望用戶能夠查詢所有這些報告,以及文檔中是否存在包含“點擊”的“點擊”部分。並且,從那裡,我相信我們希望用戶能夠繼續翻閱文檔。但不要下載整件事。希望有意義嗎?!? - Meltemi 12年2月2日0:00

77
votes
answers
77 views
+10

是否需要使用ElasticSearch的負載均衡器?

我有一個在AWS EC2上運行的3個ElasticSearch節點的集群。這些節點使用OpsWorks / Chef進行設置。我的目的是將此集群設計為非常有彈性和彈性(節點可以在需要時進出)。

從我讀過的關於ElasticSearch的所有內容來看,似乎沒有人建議在集群前放置負載均衡器; 相反,似乎建議做兩件事之一:

  1. 將客戶端指向一個節點的URL / IP,讓ES為您執行負載平衡,並希望該節點永遠不會出現故障。

  2. 將所有節點的URL / IP硬編碼到客戶端應用程序中,讓應用程序處理故障轉移邏輯。

我的背景主要是在Web場中,創建大量自治Web服務器,在其前面拋出ELB並讓負載均衡器確定哪些節點存活或死亡,這是常識。為什麼ES似乎不支持這種相同的架構?

up vote 17 down vote accepted favorite
沙发
+170
+50

You don't need a load balancer — ES is already providing that functionality. You'd just another component, which could misbehave and which would add an unnecessary network hop.

ES will shard your data (by default into 5 shards), which it will try to evenly distribute among your instances. In your case 2 instances should have 2 shards and 1 just one, but you might want to change the shards to 6 for an equal distribution.

By default replication is set to "number_of_replicas":1, so one replica of each shard. Assuming you are using 6 shards, it could look something like this (R is a replicated shard):

  • node0: 1, 4, R3, R6
  • node1: 2, 6, R1, R5
  • node2: 3, 5, R2, R4

Assuming node1 dies, the cluster would change to the following setup:

  • node0: 1, 4, 6, R3 + new replicas R5, R2
  • node2: 3, 5, 2, R4 + new replicas R1, R6

Depending on your connection setting, you can either connect to one instance (transport client) or you could join the cluster (node client). With the node client you'll avoid double hops, since you'll always connect to the correct shard / index. With the transport client, your requests will be routed to the correct instance.

So there's nothing to load balance for yourself, you'd just add overhead. The auto-clustering is probably ES's greatest strength.

@xeraa那麼“節點”客戶端通過廣播或其他東西自動解析可用的彈性節點/集群? - Tuukka Mustonen 2014年9月15日11:25

這種方法的犧牲是,現在您的服務器拓撲上的客戶端直接依賴。而且,不,你不是“添加另一個網絡躍點”。您只是改變了域名解析的方式。除非你在談論甚至在客戶端配置中使用IP地址,在這種情況下......是的。 - GlenRSmith 2015年3月14日20:09

這不回答這個問題。這是關於ES如何在內部平衡數據的一個很好的文章,但是連接到ES集群的客戶端應用程序仍然需要一種機制,以便在node1失敗時切換到node2的IP。浮動IP或IP負載均衡器可以完成這項工作,但它不包含在ES中。 - 鹼性4月7日'16在4:01

+490

我相信負載平衡Elasticsearch集群是一個好主意(設計容錯系統,對單節點故障具有彈性。)

要構建您的集群,您需要有關Elasticsearch的兩個主要功能的背景知識:1。編寫和更新文檔以及2.查詢文檔。

在elasticsearch中編寫/索引文檔:

  1. 當新文檔進入Elasticsearch進行索引時,Elasticsearch使用“碎片路由算法”確定應將文檔分配給的“主分片”
  2. 與分片關聯的Lucene進程“映射”文檔中的字段;
  3. Lucene進程將文檔添加到shard的Lucene“倒排索引”
  4. 然後任何“複製碎片”都會收到該文件; 副本分片“映射”文檔並將文檔添加到副本分片的Lucene“倒排索引”

在Elasticsearch中查詢文檔:

  1. 默認情況下,當查詢發送到Elasticsearch時,查詢會命中一個節點 - 這將成為該查詢的“查詢節點”或“網關查詢節點”
  2. 節點將查詢廣播到索引中的每個分片(主要和副本)
  3. 每個分片對分片的本地Lucene倒排索引執行查詢。
  4. 每個分片返回前10 - 20個結果到“網關查詢節點”
  5. 然後,“網關查詢節點”對從其他分片返回的組合結果執行合併排序,
  6. 一旦合併排序完成,“網關查詢節點”並將結果返回給客戶端
    • merge-sort是CPU和內存資源很重

為寫入/索引/更新構建負載均衡器

Elasticsearch自我管理節點上的分片位置。“主節點”保持並更新“分片路由表”。“主節點”將分片路由表的副本提供給集群中的其他節點。

通常,您不希望主節點執行的操作遠遠超過群集的運行狀況檢查,更新路由表以及管理分片。

最好將負載均衡器指向“數據節點”(數據節點是包含數據=分片的節點)並讓數據節點使用其分片路由表來獲取對正確分片的寫入。

構建查詢

Elasticsearch創建了一個特殊的節點類型:“客戶端節點”,其中包含“無數據”,不能成為“主節點”。客戶端節點的功能是在查詢結束時執行最終資源重合併排序。

對於AWS,您可能使用c3或c4實例類型作為“客戶端節點”

最佳做法是將負載均衡器指向客戶機節點的查詢。

乾杯!

參考文獻:

  1. Elasticsearch節點類型
  2. Elasticsearch:分片路由算法
  3. Elasticsearch:Replica Shards
  4. Elasticsearch:群集狀態,即分片路由表
  5. ElasticHQ - Elasticsearch Video簡介
  6. Elasticsearch:分片數和群集縮放

感謝您的詳細報導! - 馬特2015年2月1日5:22

+110

您想要設計“故障轉移”是非常正確的,而在AWS中,我建議您這樣做。

1)限制群集中可以選為主節點的節點。其餘的,設置node.client:true。根據您有多少主可選節點選擇您可用於故障轉移的數量。

2)創建僅包含主可選節點的ELB。

3)在Route 53中,為您的群集創建一個CNAME,其值設置為ELB的DNS名稱。

114
votes
answers
44 views
+10

過濾器對彈性搜索的意義/做什麼?

儘管我閱讀了Elasticsearch的文檔,以了解過濾器是什麼。我仍然難以理解它的含義以及簡單使用的地方。任何人都可以向我提供更多細節嗎?

up vote 97 down vote accepted favorite
沙发
+970
+50

您通常做的是索引文檔並通過查詢將其取回。percolator允許您簡單地做的是索引您的查詢並根據索引查詢滲透文檔以了解它們匹配的查詢。它也被稱為反向搜索,因為你所做的與你習慣的相反。

過濾器有不同的用例,第一個用於存儲用戶興趣的平台,以便在合適的用戶進入後立即將正確的內容髮送給他們。

例如,用戶訂閱特定主題,並且一旦該主題的新文章進入,就會向感興趣的用戶發送通知。您可以使用查詢DSL將用戶興趣表示為elasticsearch查詢,您可以將其註冊在elasticsearch中,因為它是一個文檔。每次發布新文章時,無需對其進行索引,您可以對其進行滲透以了解哪些用戶對其感興趣。此時您知道誰需要接收包含文章鏈接的通知(儘管發送通知不是由elasticsearch完成的)。另外一個步驟也是索引內容本身,但這不是必需的。

看一下這個演示文稿,從elasticsearch 1.0開始,看看其他幾個用例和其他功能與過濾器結合使用。

等效於RDBMS系統的是插入觸發器,對吧? - Eugen 2015年6月16日14:16

首先,不需要為過濾器索引該文檔。從Elastic博客來看,對Percolator新手的一個常見誤解是警報是插入文檔的副作用,類似於數據庫觸發器。不是這種情況。 - Devi 2016年1月21日6:23

我有同樣的問題理解 - 一旦你提到用戶興趣用例 - 我得到了它。謝謝 - DavidC 2016年4月5日10:28

+170

簡單來說就是percolator這樣:

用戶:嘿Percolator!你怎麼能幫幫我?

過濾器: Hai用戶!我可以幫助您獲取您感興趣的提醒。

網友:太好了!接下來我該怎麼辦?

Percolator:請以Elasticsearch索引的查詢形式告訴我您的興趣。

用戶:我已將我的所有興趣都準備好作為查詢並將其編入索引到Elasticsearch。這麼簡單嗎?

過濾器:是的!就這麼簡單!我會查看所有收到的文件,如果符合您的任何興趣(查詢),請回复您的文件!

網友:太棒了!我只是很好奇,想知道你怎麼能弄清楚哪些文件符合我的興趣。

過濾器:這是一個很好的問題!答案很簡單!您已將自己的興趣編入索引到Elasticsearch嗎?我使用它們並運行所有這些(不是全部,但為了簡單起見,我們假設所有)對傳入文檔的查詢(這些文檔不需要被索引,只能被發送用於滲透!)。實際上這個過程叫做滲透!如果任何文檔與您的任何查詢匹配,那麼我會將結果發送給客戶(也可能是您)!

至少從Elasticsearch(ES)6.2版本開始,這種解釋是不正確的。過濾器本身不會幫助您收到警報,也不會監視傳入的文檔。您首先在ES中索引滲透查詢,然後您必須自己滲透文檔以查看是否有任何文檔與percolate查詢匹配。ES會針對percolate查詢搜索您,但這是關於它的​​。(@javanna也解釋相同。) - arun 18年2月26日20:31

2
votes
answers
74 views
+10

適應圖形/分子比較算法的文本搜索

我正在尋找一個非傳統文本搜索的文本搜索引擎,我想知道哪種工具(Lucene,Sphinx,Xapian或其他)最適合我,以及從哪裡開始的指示。 我有分子表示為圖(原子和鍵)。我有辦法枚舉大小為k的所有子圖。作為技術,輸入是SMILES,輸出是規範的SMARTS和每個子圖/ SMARTS出現的次數。 例如,如果輸入分子是“ CCO ”,那麼規範結果是{“C”:2,“O”:1,“CC”:1,“OC”:1,“CCO”:1}並且如果分子是“ SCO ”,則規範結果是{“C”:1,“S”:1,“O”:1,“CS”:1,“OC”:1,“SCO”:1}。這些都是很小的例子。對於真正的分子,我得到了大約500個“單詞”,看起來像“CC(C)O”,“CCCOCC”,“cn”和“cccc(c)O”。 將分子視為特徵字符串加上計數的集合意味著我應該能夠使用文本搜索工具在文本級別進行比較,希望它們在化學級別上有意義。 舉例來說,我可以使用餘弦相似度或者tf-idf權重,並通過尋找類似的子模式找到類似的分子。通過上面的“CCO”和“SCO”示例,餘弦相似度為(2 * 1 + 1 * 1 + 1 * 1)/ sqrt(2 * 2 + 1 * 1 + 1 * 1 + 1 * 1 + 1 * 1)/ sqrt(6 *(1 * 1))= 4 / sqrt(8 * 6)= 0.58。 再舉一個例子,如果我想找到含有“CCS”亞結構的分子,那麼我可以根據計數進行快速反向索引搜索(分子必須至少有2個“C”,至少1個“CS”,在解決NP子圖的同構問題之前。也就是說,基於文本的方法可以充當過濾器以拒絕明顯的不匹配。 我試圖弄清楚存在的文本解決方案,但它有點令人生畏。我不需要停詞,我不需要詞幹,我不在乎詞序; 我不需要存在很多功能。我確實需要保留單詞向量的能力,因為知道“C”是出現2次還是3次是很重要的。 哪個文本搜索引擎最適合我?它看起來像Lucene,特別是在Mahout的工作。您能否推荐一下文檔的哪些部分或相關的教程?我發現的那些是用於全文搜索,具有詞乾和我不需要的其他功能。
沙发
+10
+50

EDIT: I may have understood this better now. You want to compare graphs, represented as strings. The strings have "words" which may repeat. You may use Lucene, in which case I second the suggestion to use Solr. Basically, each Solr document will consist of a single field; The field will contain the string, which I suggest you unroll: write C C instead of C:2. If you use a space to separate the words, you can use a WhiteSpaceAnalyzer. If you use another separator, you may need to write a custom analyzer, which is not so hard to do.

Is this a good idea? I am not sure. Here's why:

  1. Lucene (and Solr) do not use cosine similarity as such, but rather Lucene Similarity, which mixes cosine, TF/IDF and boolean scoring, with some specific modifications. This works well for most textual use-cases, but may be different than what you need.
  2. Do you need to compare hits from different searches? If you do, it is hard to do using Solr, as it normalized every search to a maximal value of 1.

I suggest you do try Solr for a small sample of your database. If Solr works for you, fine. If not, shingling and min-hashes are probably the way to go. Mining of Massive Datasets by Rajaraman and Ullman is a recent free book about these subjects. I suggest you read it. It covers search for similar strings in mountains of data. I guess the differentiator is: Do you need a relatively large intersection? If so, use shingling and min-hashes. If not, maybe Solr is enough.

字符串匹配和序列對齊?怎麼會這樣?我的“文檔”包含“單詞”,可以重複。給定查詢文檔和目標文檔集合,我想基於(比較)餘弦相似性找到集合中最近的10。對齊算法意味著順序,我的數據沒有。Needleman-Wunsch,Aho-Corasick和其他字符串匹配算法都不適用,至少不是我能說的。(順便說一句,我在生物信息學方面做了一點工作,所以我知道一些可以使用它們的地方。) - Andrew Dalke 2011年1月16日在1:44

我編輯了我的答案,以便更好地處理您的文件和文字。 - Yuval F 2011年1月16日19:47

我前幾天開始閱讀那本書,這非常有幫助。我會嘗試使用Solr,看看會發生什麼。我也在nlp.fi.muni.cz/projekty/gensim/index.html遇到了gensim。 - 安德魯達爾克2011年1月16日23:56

+10

Hmm... don't really know what are SMARTS, or how chemical similarity actually work. If you want to use lucene, first consider using solr. Since your data is in graphs, you can take a look at neo4j with the solr component. Also, would this problem be more closely related to document near duplicates? For helping with that there are a number of algorithms LSH, Spotsigs, shingling, and simhash. Wish I could be of more help.

我想看看文本搜索是否可以替換或簡化圖搜索。擁有5000萬個分子,大約有1.5億個原子和許多鍵。我沒有看到像neo4j這樣的通用圖形數據庫如何能夠接近專業化學搜索引擎的功能。但是,對每個包含最多1,000個單詞(全部唯一)的5000萬個文檔進行餘弦相似性搜索應該很容易。我正在為這項任務尋找工具。 - 安德魯達爾克2011年1月14日15:09

好的,我明白了你的意思,Solr很容易使用。它是lucene頂部的另一層。你知道每種化學品可能有多少個字段嗎?使用關鍵字標記生成器,以便獲得索引的字段中的每個輸入都不會被標記化,並且不會使用詞乾或其他特殊功能過濾索引過程。我建議你得到Packt出版的書。我認為這可能是關於企業使用搜索引擎的唯一一本書。 - Joyce 2011年1月14日15:40

每種化合物具有約200-600個“單詞”,其選自約200,000個單詞的詞彙。謝謝你的書推薦! - 安德魯達爾克2011年1月16日18:54

0

Don't use lucene. Or Solr. The internal models are antiquated and cobbled together; although they do a good job. Find an engine with the minimal criteria (if you want to map inside a text engine) BM25F fully supported. If I were after it and I wanted scalability and performance and low cost support community, frankly I'd go with SQL Server and cubes.Licensing with SQL Server could be a complete blocker. Good luck.

我不知道為什麼BM25F適合我正在做的事情。為什麼它會比餘弦相似更好?一位朋友建議Xapian,它有BM25支持,但似乎並沒有被廣泛使用。我使用Mac和其他unix變體,因此僅限Windows的解決方案將無效。 - 安德魯達爾克2011年1月15日4:40

9
votes
answers
70 views
+10

全文搜索的想法MongoDB&node.js [關閉]

我正在為我的網站開發一個搜索引擎,我想為它添加以下功能; 全文檢索 你的意思是功能嗎? MongoDB中的數據存儲 我想做一個寧靜的後端。我將手動將數據添加到mongodb並將其編入索引(我更喜歡哪一個?Mongodb索引或其他一些搜索索引庫,如Lucene)。我也想使用node.js. 這些是我從研究中發現的。對於該架構,任何想法都將受到讚賞 提前致謝
沙发
+70
+50

I'm using Node.js / MongoDB / Elasticsearch (based on Lucene). It's an excellent combination. The flow is stunning as well, since all 3 packages (can) deal with JSON as their native format, so no need for transforming DTO's etc.

Have a look: http://www.elasticsearch.org/

感謝您的回复,我也得到了這3對,但您使用谷歌搜索“你的意思”功能嗎?我也需要它。我認為彈性搜索沒有這樣的未來 - HüseyinBABAL於2012年8月4日19:05

是的,你是對的,他們正在等待Lucene 4.0在實施之前發布:github.com/elasticsearch/elasticsearch/issues/911 - Geert-Jan 8月6日'12在10:00

謝謝,我也是這樣的。我會等待那個版本。 - HüseyinBABAL於2012年8月6日10:31

你可以發一個關於如何將Elastic搜索添加到node.js + mongodb的簡單教程或指導嗎? - Marwan Roushdy 2013年2月11日10:45

也許將來。現在通過http / rest與ES交談。只需在Node中使用HTTP-stuff或使用github.com/phillro/node-elasticsearch-client獲得一個像樣的庫。我的方式是在ES中進行搜索查詢,並檢索docids。然後使用這些docids在mongoDB中進行多鍵提取。這允許ES保持精益(除了你需要在Mongo中進行提取之外的任何東西都不需要存儲任何東西),保持數據存儲(mongodb和ES)同步等方面的問題較少等等 - Geert-Jan Apr 4' 13時21分59秒

+20

I personally use Sphinx and MongoDb, it is a great pair and I have no problems with it.

I back MongoDB onto a MySQL instance which Sphinx just quickly indexes. Since you should never need to actively index _id, since I have no idea who is gonna know the _id of one of your objects to search for, you can just stash it in MySQL as a string field and it will work just fine.

When I pull the results back out of Sphinx all I do is convert to (in PHP) a new MongoId, or in your case a ObjectId and then simply query on this object id for the rest of the data. It couldn't be simpler, no problems, no hassle, no nothing. And I can spin off the load of reindexing delta indexes off to my MySQL instance keeping my MongoDB instance dealing with what it needs to: serving up tasty data for the user.

感謝您的回复,我將嘗試與mongodb的獅身人面像 - HüseyinBABAL8月4日'12在19:07

@cubuzoa np,一條建議; 如果您使用MySQL連接器(像我一樣),請確保將MySQL的默認自動遞增ID作為Sphinx到Delta Index的關鍵。我也建議使用實時索引atm的delta索引。 - Sammaye於2012年8月4日19:14

2
votes
answers
68 views
+10

今天最快的全文搜索?

劇透: 這只是另一個Lucene vs Sphinx對比什麼, 我看到所有其他線程差不多兩年了,所以決定重新開始.. 這是要求: 數據大小:最大10 GB。 行:幾乎數十億的 索引應該是快速 搜索應該在0毫秒[好吧,開玩笑......笑......但保持盡可能低] 在今天的世界裡,我/我該怎麼做? 編輯:我在lucene上做了一些時間,並且為了索引1.8gb數據,花了5分鐘。 搜索速度非常快,除非我做了*。a *需要400~500 ms。 我最擔心的是索引,這需要loooonnnnggg時間,以及很多資源!!
沙发
+20
+50

I have no experience other than with Lucene - it's pretty much the default indexing solution so don't think you can go too wrong.

10GB is not a lot of data. You'll be able to re-index it pretty rapidly - or keep it on SSDs for extra speed. And of course keep your whole index in RAM (which Lucene supports) for super-fast lookups.

我要把所有東西都放在雲端,所以我沒有看到有人像那樣給SSD提供速度:(順便說一句,RAM上的整個數據,我不能把它用於我正在開發的應用程序......它' d就像每台計算機1000 GB的獨特數據一樣,所以一切都無法進入內存...... - Shrinath 2011年2月23日14:05

好的 - 固態硬盤只會使差異化建立索引。BUt困惑 - 你說最大數據大小為10GB,而不是1000? - 理查德H 2011年2月23日14:10

哈哈:D真,不是1000 GB :)它只有10 GB ...現在檢查編輯:) - Shrinath 2011年2月23日在14:14

好吧10GB你可以放入內存嗎? - 理查德H 2011年2月23日14:44

好吧,它不是那麼簡單,由於某些原因我沒有在帖子中指明...每個10 gb會有多個索引...並且每個不同的索引都會有多個搜索者...那怎麼辦?這是我的觀點...對不起的混亂,如果它只有10 GB,你是100%正確... - Shrinath 2011年2月23日在17:09

0

Please check Lucene wiki for tips on improving Lucene indexing speed. This is quite succinct. In general, Lucene is quite fast (it is used for real-time search.) The tips will be handy to figure out if you are missing out on something "obvious."

我現在已經完成了所有“顯而易見”的事情:)只想知道“這個”是否可行之路:)順便說一下,索引時間還好嗎?它的5分鐘到1.8GB? - Shrinath 2011年2月23日17:30

大小有些不准確的指標。索引1.8G的純文本與索引1.8G HTML(您將解析並索引提取的文本)不同。如果“足夠快”滿足您的需求,您需要查看。如果現有索引速度低於您的預期,您可能希望探索如何在實時環境中使用Lucene。這是非平凡的。 - Shashikant Kore 2011年2月23日17:59

@Shrinath - 您的索引速度受限於您讀取磁盤的速度,以及在索引插入之前需要處理多少數據。 - 理查德H 2011年2月24日11:28

@Richard:同意..在插入之前只進行了一些String操作,這也增加了時間......我會嘗試減少操作,但只是想確定是否有辦法加速lucene更多.. - Shrinath 2011年2月24日12:44

0

My biggest worry is indexing, which is taking loooonnnnggg time, and lot of resources!!

Take a look at Lusql, we used it once, FWIW 100 GBdata from mysql on a decent machine took little more than an hour to index, on filesystem(NTFS)

Now if u add SSD or whatever ultra fast disk tecnnology, you can bring it down considerably

6
votes
answers
42 views
+10

PHP找到相關性

假設我收集了10篇不同主題的100,000篇文章。我不知道哪些文章實際上屬於哪個主題,但我有完整的新聞文章(可以分析它們的關鍵字)。我想根據他們的主題對這些文章進行分組。知道我該怎麼做嗎?任何發動機(獅身人面像,lucene)都可以。
沙发
+20

在機器學習/數據挖掘方面,我們將這類問題稱為分類問題最簡單的方法是使用過去的數據進行未來預測,即統計導向:http//en.wikipedia.org/wiki/Statistical_classification,您可以從中使用樸素貝葉斯分類器(常用於垃圾郵件檢測)

我建議你閱讀這本書(雖然是為Python寫的):編程集體智慧(http://www.amazon.com/Programming-Collective-Intelligence-Building-Applications/dp/0596529325),他們有一個很好的例子。

板凳
+20

Mahout是一個提供機器學習庫的apache項目其功能包括:

[...]聚類採用例如文本文檔並將它們分組為局部相關文檔組。分類從現有的分類文檔中學習特定類別的文檔是什麼樣的,並且能夠將未標記的文檔分配給(希望)正確的類別。[...]

你可以在http://mahout.apache.org/找到Mahout

雖然我從未使用過Mahout,只考慮過它;-),但它似乎總是需要相當多的理論知識。因此,如果你打算花一些時間在這個問題上,Mahout可能是一個很好的起點,特別是因為它有很好的記錄。但是不要指望它很容易;-)

Ui, I totally forgot to mention another alternative. If you seek something like mahout, but being easier to implement try out Bobo-Browse: sna-projects.com/bobo Actually I believe Bobo-Browse could do an excellent job in your case. – ftiaronsem Aug 12 '10 at 18:24

hi friend i need help in sphinx .I am new to Sphinx .how configure the sphinx in wamp sever in local host. – Karthik Apr 15 '11 at 4:58

地板
+10

創建分類器的簡單方法:

從100K手動讀取和存儲N個示例文檔到您的10個主題中的每一個。通常,越多的示例文檔越好。

創建一個Lucene / Sphinx索引,其中包含與每個主題相對應的10個文檔。每個文檔將包含連接在一起的該主題的所有示例文檔。

要對文檔進行分類,請將該文檔作為查詢提交,方法是將每個單詞設為OR項。你幾乎總能得到所有10個結果。Lucene / Sphinx將為每個結果分配一個分數,您可以將其解釋為文檔與每個主題的“相似性”。

可能不是超精確,但如果你不想經歷訓練真正的樸素貝葉斯分類器的麻煩,這很容易。如果你想走那條路,你可以穀歌為WEKA或MALLET,兩個很好的機器學習庫。

4楼
+10

摘自“智能網算法”第7章(Manning 2009):

“換句話說,我們將討論在假設的Web應用程序環境中採用我們的算法。特別是,我們的示例涉及一個受Google新聞網站啟發的新聞門戶網站。”

因此,該書第7章的內容應該為您提供代碼,以及您正在嘗試解決的問題的理解。

5楼
0

您可以使用sphinix搜索所有10個不同主題的所有文章,然後設置一個閾值,以確定文章鏈接到特定主題的匹配數,等等

The thing is, I don't know what topic it's going to be. It's dynamic. – Patrick Aug 10 '10 at 11:48

6楼
0

我推薦Haralambos Marmanis和Dmitry Babenko撰寫的“智能網的算法”一書。有一章介紹瞭如何做到這一點。

7楼
0

我不是可以完全自動化這個,但你可以做大部分。問題是主題來自哪裡?

從每篇文章中提取最常見的單詞和短語列表,並將其用作標記。

然後我會列出一個主題列表,並分配屬於該主題的單詞和短語,然後將其與標籤相匹配。問題是每篇文章可能會有多個主題。

也許最好的方法是使用某種形式的貝葉斯分類器來確定哪個主題最能描述該文章。這將要求您最初訓練系統。

這種技術用於確定電子郵件是否為垃圾郵件。

這篇文章可能會有所幫助