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: 7

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

0
votes
answers
104 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/

6
votes
answers
30 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

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

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

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

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

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

這篇文章可能會有所幫助

10
votes
answers
68 views
+10

Choosing a stand-alone search server with custom ranking function, spartial search

I'm looking into the different options for choosing a search server for a project I'm involved in. The search server is used to power results on a dating website built in Rails, in which the search provides all the 'matchmaking'-magic.

Typical queries would involve ranking documents/results using an expression (in pseudo-code):

  • Order by ranking:
    • +50 if has_image attribute is true
    • +10 if has_boost attribute is true
    • +50 if latitude/longitude is within 40 miles from [point]
    • +20 if latitude/longitude is within 80 miles [point]
    • -(distance from attribute 'age' to 30)
  • Filter by:
    • Attribute 'age' between 25 and 35
    • Attribute 'sex' equals 'male'

Per default I'm not needing the full-text features of most of the search servers out there, and I do not need the full documents to be retrieved - just a unique ID.

The nature of the project yields for a search-server with the following properties:

  • Spartial ranking
  • Ranking of results based on a custom function
  • Attribute filters
  • Scalable and fast
  • Free

I've found Sphinx, Solr and ElasticSearch, but all of these are (as far as I see) built and optimized for full-text searching, with both ES and Solr built on Lucene, and I don't know what would perform best for filter/attribute heavy searching.

My questions:

  • Which of these servers would you prefer and why?
  • Have I missed any other obvious choices?
沙发
+40
+50

ElasticSearch也具有所有這些功能。

支持各種語言的地理距離/邊界框/多邊形和自定義分數腳本:http//www.elasticsearch.com/docs/elasticsearch/rest_api/query_dsl/

您對過濾器或其他查詢類型的性能沒有任何問題,我們在某些??情況下對100多個屬性的查詢進行大量過濾,而且速度很快。

另一件需要考慮的事情是與數據存儲集成。ES有一個很好的River功能,但它與所有數據存儲都不兼容,但類似的可以通過post commit hooks實現。

此外,社交網站受益於(近)實時搜索,ElasticSearch默認為1秒。配置和擴展比Solr更乾淨。這是我對每個應用程序經過一個月的評估後的看法。它還可以很好地適應您的數據模型。

希望這可以幫助。

保羅

+50

不知道其他人,但Solr可以做到這一切:

空間排名

你需要每晚構建一個Solr(截至本文撰寫時最新的穩定版本,Solr 1.4.1,不包括此功能),據我所知這是一個非常穩定的主幹功能。

基於自定義函數的結果排名

Solr有很多函數查詢來進行提升。

屬性過濾器

這是一種常見的搜索功能。

可擴展且快速

很多大型網站都在使用Solr,證明了它的可擴展性和速度。

自由

Solr是Apache許可的,非常寬鬆的許可證。

+10

你不是在談論搜索引擎。你在談論數據庫。在SQL中,過濾是標準的SELECT東西; 排名可以通過涉及大量CASE的一些狡猾的表達來完成,然後是ORDER BY。

要執行查詢的空間部分,您需要一個具有地理空間功能的數據庫。

PostgreSQL是唯一具有地理空間特性的可擴展,快速,免費的關係數據庫。

0

我認為雖然您可以使用像Solr或ES這樣的搜索引擎來支持這一點,但我認為您定義的“業務規則”意味著您最終會進行後期處理。

我認為過濾和基本搜索很容易在您的搜索引擎中完成,但我猜測排序邏輯最終會變得非常自定義和復雜,並且嘗試將其推送到您的搜索查詢中可能就像放置一輪掛在一個方孔...最好查詢結果,然後使用自己的後處理器規則庫來處理排序。

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

2
votes
answers
56 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

117
votes
answers
52 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

0
votes
answers
52 views
+10

Search engine for linguistic corpus

I'm trying to find a good library for building a linguistic corpus search engine. Such an engine must produce absolutely transparent search result (exact numbers of found matches, no result cutting even if the entire corpus matches), basic query syntax (AND, OR, NOT operators, distance search, wildcard search) and the ability of refining the documents set to search in (i.e., setting a subcirous). An important detail is the ability of index partitioning and performing search in parallel (the size of corpus has the order of 10^8 words, and the search service must be real time).

The main choice is between Sphinx and Clucene (a C++ Lucene port). Unfortunately, I don't know much about these libraries organization, so it would be very helpful to know which one fits my requirements better.

(I've also tried a specialized engine - IMS Corpus Workbench - which turned out not to be as scalable as needed).

9
votes
answers
115 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

2
votes
answers
46 views
+10

Fastest full text search today?

spoiler :
This is just another Lucene vs Sphinx vs whatever,
I saw that all other threads were almost two years old, so decided to start again..

Here is the requirement :

data size : max 10 GB.
rows : nearly billions
indexing should be fast
searching should be under 0 ms [ ok, joke... laugh... but keep this as low as possible ]

In today's world, which/what/how do I go about it ?

edit : I did some timing on lucene, and for indexing 1.8gb data, it took 5 minutes.
searching is pretty fast, unless I do a a*. a* takes 400 ~ 500 ms.
My biggest worry is indexing, which is taking loooonnnnggg time, and lot of resources!!

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