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

9
votes
answers
23 views
+10

How can Sphinx do its sorting so fast?

Let's say I search for "baby". Sphinx will grab all the documents that have "baby" in it, and then sort it using my own algorithm. (EXTENDED mode).

The question is, how can it sort so fast? How does it grab millions of records and then sort them within milliseconds?

沙发
+90

哦,你問的是魔法。Sphinx(和Lucene以及許多其他搜索引擎)正在使用倒排索引

基本上,每個文件都被切成標記; 搜索索引包括從標記到稱為發布列表的文檔的映射處理查詢包括查看查詢術語的發布列表和查找匹配文檔。為了加快速度,令牌將存儲為整數列表。通過壓縮索引可以使這更有效

Very interesting read (so far...) thanks for the link :) – Matthieu M. Nov 8 '10 at 11:20

9
votes
answers
28 views
+10

Ideas for full text search MongoDB & node.js [closed]

I am developing a search engine for my website and i want to add following features to it;

  1. Full text search
  2. Did you mean feature
  3. Data store in MongoDB

I want to make a restful backend. I will be add data to mongodb manually and it will be indexed (which one i can prefer? Mongodb indexing or some other search indexing libraries like Lucene). I also want to use node.js. These are what i found from my researches. Any idea would be appreciated for the architecture

Thanks in advance

沙发
+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

0
votes
answers
30 views
+10

Alternatives to search software/servers to retrieving IDs for all matching documents

I am trying to figure out how to filter a very large set of documents based on keyword matching.

I have 20+million entries with ID and (several) text fields in my SQL database and I want to get all IDs for which the text matches a set of keywords. This includes more complex expressions like:

 (term1 NEAR term2 NEAR term3) AND NOT "A phrase" AND @fieldXYZ "wildcards%aswell*"

The results do not need to be scored, sorted or ranked in any way.

From what I understand the power of Lucene/Solr, Sphinx and ElasticSearch is to give back the TOP documents super fast but they are not really intended to give back ALL documents.

I know that it is possible to do this with a custom Collector in Lucene (see What's the most efficient way to retrieve all matching documents from a query in Lucene, unsorted?) and possibly with Cursors/Scrolling in Solr/Elasticsearch but I am wondering if there is any other technology that is specifically optimized for this problem?

0
votes
answers
42 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%確定。

77
votes
answers
33 views
+10

Is using a load balancer with ElasticSearch unnecessary?

I have a cluster of 3 ElasticSearch nodes running on AWS EC2. These nodes are setup using OpsWorks/Chef. My intent is to design this cluster to be very resilient and elastic (nodes can come in and out when needed).

From everything I've read about ElasticSearch, it seems like no one recommends putting a load balancer in front of the cluster; instead, it seems like the recommendation is to do one of two things:

  1. Point your client at the URL/IP of one node, let ES do the load balancing for you and hope that node never goes down.

  2. Hard-code the URLs/IPs of ALL your nodes into your client app and have the app handle the failover logic.

My background is mostly in web farms where it's just common sense to create a huge pool of autonomous web servers, throw an ELB in front of them and let the load balancer decide what nodes are alive or dead. Why does ES not seem to support this same architecture?

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名稱。

0
votes
answers
50 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具有更好的定製性,因爲絕對一切都是開源的。彈性可能有更好的支付。免費支持,我不知道。 –

2
votes
answers
26 views
+10

adapting text search for graph/molecule comparison algorithms

I'm looking for a text search engine for a non-traditional sort of text search and I want advice on which tool (Lucene, Sphinx, Xapian, or something else) is most appropriate for me, plus pointers on where to get started.

I have molecules represented as graphs (atoms and bond). I have a way to enumerate all subgraphs of up to size k. Being technical, the inputs are SMILES and the output is canonical SMARTS and the number of times each subgraph/SMARTS occurs.

For example, if the input molecule is "CCO" then the canonical results are {"C": 2, "O": 1, "CC": 1, "OC": 1, "CCO": 1} and if the molecule is "SCO" then the canonical results are {"C": 1, "S": 1, "O": 1, "CS": 1, "OC": 1, "SCO": 1}. These are tiny examples. For real molecule I got around 500 "words", which look like "CC(C)O", "CCCOCC", "cn" and "cccc(c)O".

Looking at molecules as a collections of characteristic strings plus counts means I should be able to use a text search tool to do comparisons at the text level, with the hopes that they are meaningful at the chemistry level.

For examples, I can use cosine similarity perhaps with tf-idf weight and find similar molecules by looking for similar subpatterns. With the "CCO" and "SCO" examples above, the cosine similarity is (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.

For another example, if I want to find molecules which contain a "CCS" substructure then I can do a fast inverted index search based on the counts (the molecules must have at least 2 "C"s, at least 1 "CS", and so on) before tackling the NP subgraph isomorphism problem. That is, text-based methods can act as a filter to reject obvious mismatches.

I'm trying to figure out the text solutions which exist but it's a bit daunting. I don't need stop words, I don't need stemming, I don't care about word order; I don't need quite a number of the features which exist. I do need the ability to keep word vectors, since it's important to know if "C" appears 2 time or 3.

Which text search engine is most appropriate for me? It looks like Lucene, especially with the work in Mahout. Can you recommend which parts of the documentation to look at or relevant tutorials? The ones I've found are meant for full-text searches, with stemming and the other features I don't need.

沙发
+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

6
votes
answers
8 views
+10

PHP find relevance

Say I have a collection of 100,000 articles across 10 different topics. I don't know which articles actually belong to which topic but I have the entire news article (can analyze them for keywords). I would like to group these articles according to their topics. Any idea how I would do that? Any engine (sphinx, lucene) is ok.

沙发
+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

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

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

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

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

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

這篇文章可能會有所幫助

114
votes
answers
18 views
+10

What does percolator mean/do in elasticsearch?

Even though I read the documentation for Elasticsearch to understand what a percolator is. I still have difficulty understanding what it means and where it is used in simple terms. Can anyone provide me with more details?

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

117
votes
answers
28 views
+10

Best practices for searchable archive of thousands of documents (pdf and/or xml)

Revisiting a stalled project and looking for advice in modernizing thousands of "old" documents and making them available via web.

Documents exist in various formats, some obsolete: (.doc, PageMaker, hardcopy (OCR), PDF, etc.). Funds are available to migrate the documents into a 'modern' format, and many of the hardcopies have already been OCR'd into PDFs - we had originally assumed that PDF would be the final format but we're open to suggestions (XML?).

Once all docs are in a common format we would like to make their contents available and searchable via a web interface. We'd like the flexibility to return only portions (pages?) of the entire document where a search 'hit' is found (I believe Lucene/elasticsearch makes this possible?!?) Might it be more flexible if content was all XML? If so how/where to store the XML? Directly in database, or as discrete files in the filesystem? What about embedded images/graphs in the documents?

Curious how others might approach this. There is no "wrong" answer I'm just looking for as many inputs as possible to help us proceed.

Thanks for any advice.

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