⑴ 有用python做過中文分詞全文索引的嗎
pipinstallsnownlp#中文文本的情感分析
fromsnownlpimportSnowNLP
s=SnowNLP(u'這個東西真心很贊')
s.words#[u'這個',u'東西',u'真心',
#u'很',u'贊']
s.tags#[(u'這個',u'r'),(u'東西',u'n'),
#(u'真心',u'd'),(u'很',u'd'),
#(u'贊',u'Vg')]
s.sentiments#0.9769663402895832positive的概率
s.pinyin#[u'zhe',u'ge',u'dong',u'xi',
#u'zhen',u'xin',u'hen',u'zan']
s=SnowNLP(u'「繁體字」「繁體中文」的叫法在台灣亦很常見。')
s.han#u'「繁體字」「繁體中文」的叫法
#在台灣亦很常見。'
⑵ 如何從python中的多索引數據中獲取索引號
你是說獲取上面的項目編號嗎?
試過項目編號獲取沒成功。但段落編號我搞定了:
a=activedocument.range(0,
selection.end).paragraphs.count
a裡面就是當時游標所在的段落號,舉例,全文有10段,游標在第3段,返回值就是3。
⑶ 如何在Python的Flask框架中實現全文搜索
灰常不幸的是,關系型資料庫對全文檢索的支持沒有被標准化。不同的資料庫通過它們自己的方式來實現全文檢索,而且SQLAlchemy在全文檢索上也沒有提供一個好的抽象。
我們現在使用SQLite作為我們的資料庫,所以我們可以繞開SQLAlchemy而使用SQLite提供的工具來創建一個全文檢索索引。但這么做不怎麼好,因為如果有一天我們換用別的資料庫,那麼我們就得重寫另一個資料庫的全文檢索方法。
所以我們的方案是,我們將讓我們現有的資料庫處理常規數據,然後我們創建一個專門的資料庫來解決全文檢索。
⑷ 網路爬蟲主要能幹啥
網路爬蟲,是一種自動獲取網頁內容的程序,是搜索引擎的重要組成部分。一般人能訪問到的網頁,爬蟲也都能抓取。所謂的爬蟲抓取,也是類似於我們瀏覽網頁。但與普通人上網方式不同,爬蟲是可以按照一定的規則,自動的採集信息。
舉個例子,比如說你從事的是文字編輯工作,需求稿件量大,可是效率很低,最大的一個原因便是很多的時間花費在了採集資料上,假如繼續按照之前手動瀏覽的方式,要麼就是你通宵達旦熬夜加班,要麼便是讓其他人幫你,但顯然兩者都不方便。這種情況下,網路爬蟲就顯得很重要。
隨著大數據時代的來臨,網路爬蟲在互聯網中的地位將越來越重要。互聯網中的數據是海量的,如何自動高效地獲取互聯網中我們感興趣的信息並為我們所用是一個重要的問題,而爬蟲技術就是為了解決這些問題而生的。
我們感興趣的信息分為不同的類型:如果只是做搜索引擎,那麼感興趣的信息就是互聯網中盡可能多的高質量網頁;如果要獲取某一垂直領域的數據或者有明確的檢索需求,那麼感興趣的信息就是根據我們的檢索和需求所定位的這些信息,此時,需要過濾掉一些無用信息。前者我們稱為通用網路爬蟲,後者我們稱為聚焦網路爬蟲。
⑸ 如何評價whoosh這個python搜索框架
Whoosh 是一個純python實現的全文搜索組件。Whoosh不但功能完善,還非常的快。
Whoosh的作者是MattChaput,由Side Effects Software公司開發。項目的最初用於Houdini(Side Effects Software公司開發的3D動畫軟體)的在線幫助系統。Side Effects Software公司將該項目開源。
主要特性:
* 敏捷的API(Pythonic API)。
* 純python實現,無二進制包。程序不會莫名其妙的崩潰。
* 按欄位進行索引。
* 索引和搜索都非常的快 -- 是目前最快的純python全文搜索引擎。
* 良好的構架,評分模塊/分詞模塊/存儲模塊等各個模塊都是可插拔的。
* 功能強大的查詢語言(通過pyparsing實現功能)。
* 純python實現的拼寫檢查(目前唯一的純python拼寫檢查實現)
為啥選擇Whoosh
* 純python實現,省了編譯二進制包的繁瑣過程。
* python代碼比java更容易讀懂,而且用起來也更方便。(翻者註:這個容易引發口水)
* 在很多時候易用性比單純的最求速度更重要。
Whoosh從其他的開源搜索引擎中獲取了大量的靈感。 基礎構建參考Lucene,使用KinoSearch的索引演算法,部分評分演算法來自Terrier,英文的詞語態變化來自Minion.
⑹ 請教python操作資料庫表的結果集的整理
,選擇開始菜單中→程序→【Management SQL Server 2008】→【SQL Server Management Studio】命令,打開【SQL Server Management Studio】窗口,並使用Windows或 SQL Server身份驗證建立連接。
在【對象資源管理器】窗口中展開伺服器,然後選擇【資料庫】節點
右鍵單擊【資料庫】節點,從彈出來的快捷菜單中選擇【新建資料庫】命令。
執行上述操作後,會彈出【新建資料庫】對話框。在對話框、左側有3個選項,分別是【常規】、【選項】和【文件組】。完成這三個選項中的設置會後,就完成了資料庫的創建工作,
在【資料庫名稱】文本框中輸入要新建資料庫的名稱。例如,這里以「新建的資料庫」。
在【所有者】文本框中輸入新建資料庫的所有者,如sa。根據資料庫的使用情況,選擇啟用或者禁用【使用全文索引】復選框。
在【資料庫文件】列表中包括兩行,一行是資料庫文件,而另一行是日記文件。通過單擊下面的【添加】、【刪除】按鈕添加或刪除資料庫文件。
切換到【選項頁】、在這里可以設置資料庫的排序規則、恢復模式、兼容級別和其他屬性。
切換到【文件組】頁,在這里可以添加或刪除文件組。
完成以上操作後,單擊【確定】按鈕關閉【新建資料庫】對話框。至此「新建的數據」資料庫創建成功。新建的資料庫可以再【對象資源管理器】窗口看到。
⑺ 如何使用織夢DedeCMS v5.7全文檢索說明
1.1.開始前的准備工作
先從http://www.coreseek.cn/procts/ft_down/下載Coreseek 3.2.13,這里我們就以Windows環境為例:
下載後直接解壓coreseek-3.2.13-win32.zip,我們這里假設解壓到:D:\coreseek-3.2.13-win32.這里我們需要簡單了解幾個目錄:
[D:\coreseek-3.2.13-win32\api]API介面目錄,其中包括了php,python,ruby等操作實例,其中test_coreseek.php是一個不錯的中文檢索的例子.
[D:\****\bin]應用程序目錄,其中包含以下幾個文件
* indexer: 用於創建全文索引;
* search: 一個簡單的命令行(CLI) 的測試程序,用於測試全文索引;
* searchd: 一個守護進程,其他軟體可以通過這個守護進程進行全文檢索;
* sphinxapi: 一系列searchd 的客戶端API 庫,用於流行的Web腳本開發語言(PHP, Python, Perl, Ruby, Java).
* spellmp: 一個簡單的命令行工具,用於從 ispell 或 MySpell (OpenOffice內置綁定) 格式的字典中提取詞條。當使用 wordforms 時可用這些詞條對索引進行定製.
* indextool: 工具程序,用來轉儲關於索引的多項調試信息。 此工具是從版本Coreseek 3.1(Sphinx 0.9.9-rc2)開始加入的。
* mmseg: 工具程序和庫,Coreseek用於提供中文分詞和詞典處理。
[D:\****\etc]sphinx配置目錄
[D:\****\var]sphinx變數&索引&日誌存放目錄
1.2.創建配置文件
由於dedecms使用的是mysql,所以我們需要來配置一個mysql的sphinx模板配置,可以復制csft_mysql.conf改名為:csft_dedecmsv57.conf,例如我們這里僅做文章的全文檢索,我們需要做如下配置:
先在DedeCMS中創建一個統計表,方法可以在DedeCMS後台[系統]->[SQL命令行工具]中執行下列代碼:
CREATE TABLE `dede_sphinx` (
`countid` int(11) unsigned NOT NULL,
`maxaid` int(11) unsigned NOT NULL,
PRIMARY KEY (`countid`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk
這是一個sphinx內容統計表,為了適合數據量較大的情況下分批生成索引而使用的.
創建完數據表後,我們對sphinx的配置文件,即csft_dedecmsv57.conf修改,內容如下,其中包含注釋:
--------------------------------------------------------------------------------------------
#源定義
source mysql
{
type = mysql
# 資料庫伺服器基本配置信息
sql_host = 192.168.0.103
sql_user = dedev57
sql_pass = dedecms
sql_db = dedecmsv57gbk
sql_port = 3306
# 設定編碼,這里我們是gbk編碼,如果是utf-8,可以設置:
# sql_query_pre = SET NAMES utf8
sql_query_pre = SET NAMES gbk
# 數據檢索增量
sql_range_step = 1000
#當前最新文檔id數
sql_query_pre = REPLACE INTO dede_sphinx SELECT 1, MAX(id) FROM dede_archives
#檢索條件
sql_query = SELECT ARC.id,ARC.typeid,ARC.typeid2,ARC.sortrank,ARC.flag,ARC.channel,ARC.ismake,ARC.arcrank,ARC.click,ARC.title,ARC.shorttitle,ARC.color,ARC.writer,ARC.source,ARC.litpic,ARC.pubdate,ARC.senddate,ARC.mtype,ARC.description,ARC.badpost,ARC.goodpost,ARC.scores,ARC.lastpost,ARC.keywords,ARC.mid,ART.body FROM dede_archives AS ARC LEFT JOIN dede_addonarticle AS ART ON ARC.id = ART.aid WHERE ARC.id>=$start AND ARC.id<=$end #sql_query第一列id需為整數
#title、body作為字元串/文本欄位,被全文索引http://www.dede58.com/a/dedeaz/1678.html
⑻ elasticsearch JPA執行save方法後,發現elasticsearch有文件生成,但資料庫中沒數據
由於需要提升項目的搜索質量,最近研究了一下Elasticsearch,一款非常優秀的分布式搜索程序。最開始的一些筆記放到github,這里只是歸納總結一下。
首先,為什麼要使用Elasticsearch?最開始的時候,我們的項目僅僅使用MySQL進行簡單的搜索,然後一個不能索引的like語句,直接拉低MySQL的性能。後來,我們曾考慮過sphinx,並且sphinx也在之前的項目中成功實施過,但想想現在的數據量級,多台MySQL,以及搜索服務本身HA,還有後續擴容的問題,我們覺得sphinx並不是一個最優的選擇。於是自然將目光放到了Elasticsearch上面。
根據官網自己的介紹,Elasticsearch是一個分布式搜索服務,提供Restful API,底層基於Lucene,採用多shard的方式保證數據安全,並且提供自動resharding的功能,加之github等大型的站點也採用 Elasticsearch作為其搜索服務,我們決定在項目中使用Elasticsearch。
對於Elasticsearch,如果要在項目中使用,需要解決如下問題:
索引,對於需要搜索的數據,如何建立合適的索引,還需要根據特定的語言使用不同的analyzer等。
搜索,Elasticsearch提供了非常強大的搜索功能,如何寫出高效的搜索語句?
數據源,我們所有的數據是存放到MySQL的,MySQL是唯一數據源,如何將MySQL的數據導入到Elasticsearch?
對於1和2,因為我們的數據都是從MySQL生成,index的field是固定的,主要做的工作就是根據業務場景設計好對應的mapping以及search語句就可以了,當然實際不可能這么簡單,需要我們不斷的調優。
而對於3,則是需要一個工具將MySQL的數據導入Elasticsearch,因為我們對搜索實時性要求很高,所以需要將MySQL的增量數據實時導入,筆者唯一能想到的就是通過row based binlog來完成。而近段時間的工作,也就是實現一個MySQL增量同步到Elasticsearch的服務。
Lucene
Elasticsearch底層是基於Lucene的,Lucene是一款優秀的搜索lib,當然,筆者以前仍然沒有接觸使用過。:-)
Lucene關鍵概念:
Document:用來索引和搜索的主要數據源,包含一個或者多個Field,而這些Field則包含我們跟Lucene交互的數據。
Field:Document的一個組成部分,有兩個部分組成,name和value。
Term:不可分割的單詞,搜索最小單元。
Token:一個Term呈現方式,包含這個Term的內容,在文檔中的起始位置,以及類型。
Lucene使用Inverted index來存儲term在document中位置的映射關系。
譬如如下文檔:
Elasticsearch Server 1.0 (document 1)
Mastring Elasticsearch (document 2)
Apache Solr 4 Cookbook (document 3)
使用inverted index存儲,一個簡單地映射關系:
Term
Count
Docuemnt
1.0 1
4 1
Apache 1
Cookbook 1
Elasticsearch 2 .
Mastering 1
Server 1
Solr 1
對於上面例子,我們首先通過分詞演算法將一個文檔切分成一個一個的token,再得到該token與document的映射關系,並記錄token出現的總次數。這樣就得到了一個簡單的inverted index。
Elasticsearch關鍵概念
要使用Elasticsearch,筆者認為,只需要理解幾個基本概念就可以了。
在數據層面,主要有:
Index:Elasticsearch用來存儲數據的邏輯區域,它類似於關系型資料庫中的db概念。一個index可以在一個或者多個shard上面,同時一個shard也可能會有多個replicas。
Document:Elasticsearch裡面存儲的實體數據,類似於關系數據中一個table裡面的一行數據。
document由多個field組成,不同的document裡面同名的field一定具有相同的類型。document裡面field可以重復出現,也就是一個field會有多個值,即multivalued。
Document type:為了查詢需要,一個index可能會有多種document,也就是document type,但需要注意,不同document裡面同名的field一定要是相同類型的。
Mapping:存儲field的相關映射信息,不同document type會有不同的mapping。
對於熟悉MySQL的童鞋,我們只需要大概認為Index就是一個db,document就是一行數據,field就是table的column,mapping就是table的定義,而document type就是一個table就可以了。
Document type這個概念其實最開始也把筆者給弄糊塗了,其實它就是為了更好的查詢,舉個簡單的例子,一個index,可能一部分數據我們想使用一種查詢方式,而另一部分數據我們想使用另一種查詢方式,於是就有了兩種type了。不過這種情況應該在我們的項目中不會出現,所以通常一個index下面僅會有一個 type。
在服務層面,主要有:
Node: 一個server實例。
Cluster:多個node組成cluster。
Shard:數據分片,一個index可能會存在於多個shards,不同shards可能在不同nodes。
Replica:shard的備份,有一個primary shard,其餘的叫做replica shards。
Elasticsearch之所以能動態resharding,主要在於它最開始就預先分配了多個shards(貌似是1024),然後以shard為單位進行數據遷移。這個做法其實在分布式領域非常的普遍,codis就是使用了1024個slot來進行數據遷移。
因為任意一個index都可配置多個replica,通過冗餘備份的方式保證了數據的安全性,同時replica也能分擔讀壓力,類似於MySQL中的slave。
Restful API
Elasticsearch提供了Restful API,使用json格式,這使得它非常利於與外部交互,雖然Elasticsearch的客戶端很多,但筆者仍然很容易的就寫出了一個簡易客戶端用於項目中,再次印證了Elasticsearch的使用真心很容易。
Restful的介面很簡單,一個url表示一個特定的資源,譬如/blog/article/1,就表示一個index為blog,type為aritcle,id為1的document。
而我們使用http標准method來操作這些資源,POST新增,PUT更新,GET獲取,DELETE刪除,HEAD判斷是否存在。
這里,友情推薦httpie,一個非常強大的http工具,個人感覺比curl還用,幾乎是命令行調試Elasticsearch的絕配。
一些使用httpie的例子:
# create
http POST :9200/blog/article/1 title="hello elasticsearch" tags:='["elasticsearch"]'
# get
http GET :9200/blog/article/1
# update
http PUT :9200/blog/article/1 title="hello elasticsearch" tags:='["elasticsearch", "hello"]'
# delete
http DELETE :9200/blog/article/1
# exists
http HEAD :9200/blog/article/1
索引和搜索
雖然Elasticsearch能自動判斷field類型並建立合適的索引,但筆者仍然推薦自己設置相關索引規則,這樣才能更好為後續的搜索服務。
我們通過定製mapping的方式來設置不同field的索引規則。
而對於搜索,Elasticsearch提供了太多的搜索選項,就不一一概述了。
索引和搜索是Elasticsearch非常重要的兩個方面,直接關繫到產品的搜索體驗,但筆者現階段也僅僅是大概了解了一點,後續在詳細介紹。
同步MySQL數據
Elasticsearch是很強大,但要建立在有足量數據情況下面。我們的數據都在MySQL上面,所以如何將MySQL的數據導入Elasticsearch就是筆者最近研究的東西了。
雖然現在有一些實現,譬如elasticsearch-river-jdbc,或者elasticsearch-river-mysql,但筆者並不打算使用。
elasticsearch-river-jdbc的功能是很強大,但並沒有很好的支持增量數據更新的問題,它需要對應的表只增不減,而這個幾乎在項目中是不可能辦到的。
elasticsearch-river-mysql倒是做的很不錯,採用了python-mysql-replication來通過binlog獲取變更的數據,進行增量更新,但它貌似處理MySQL mp數據導入的問題,不過這個筆者真的好好確認一下?話說,python-mysql-replication筆者還提交過pull解決了minimal row image的問題,所以對elasticsearch-river-mysql這個項目很有好感。只是筆者決定自己寫一個出來。
為什麼筆者決定自己寫一個,不是因為筆者喜歡造輪子,主要原因在於對於這種MySQL syncer服務(增量獲取MySQL數據更新到相關系統),我們不光可以用到Elasticsearch上面,而且還能用到其他服務,譬如cache上面。所以筆者其實想實現的是一個通用MySQL syncer組件,只是現在主要關注Elasticsearch罷了。
項目代碼在這里go-mysql-elasticsearch,現已完成第一階段開發,內部對接測試中。
go-mysql-elasticsearch的原理很簡單,首先使用mysqlmp獲取當前MySQL的數據,然後在通過此時binlog的name和position獲取增量數據。
一些限制:
binlog一定要變成row-based format格式,其實我們並不需要擔心這種格式的binlog佔用太多的硬碟空間,MySQL 5.6之後GTID模式都推薦使用row-based format了,而且通常我們都會把控SQL語句質量,不允許一次性更改過多行數據的。
需要同步的table最好是innodb引擎,這樣mysqlmp的時候才不會阻礙寫操作。
需要同步的table一定要有主鍵,好吧,如果一個table沒有主鍵,筆者真心會懷疑設計這個table的同學編程水平了。多列主鍵也是不推薦的,筆者現階段不打算支持。
一定別動態更改需要同步的table結構,Elasticsearch只能支持動態增加field,並不支持動態刪除和更改field。通常來說,如果涉及到alter table,很多時候已經證明前期設計的不合理以及對於未來擴展的預估不足了。
更詳細的說明,等到筆者完成了go-mysql-elasticsearch的開發,並通過生產環境中測試了,再進行補充。
總結
最近一周,筆者花了不少時間在Elasticsearch上面,現在算是基本入門了。其實筆者覺得,對於一門不懂的技術,找一份靠譜的資料(官方文檔或者入門書籍),蛋疼的對著資料敲一遍代碼,不懂的再問google,最後在將其用到實際項目,這門技術就算是初步掌握了,當然精通還得在下點功夫。
現在筆者只是覺得Elasticsearch很美好,上線之後鐵定會有坑的,那時候只能慢慢填了。話說,筆者是不是要學習下java了,省的到時候看不懂代碼就慘了。:-)
⑼ 如何 用 python 和elasticsearch 做全文檢索
#coding:utf-8
from elasticsearch import Elasticsearch
es = Elasticsearch([{'host':'192.168.3.22','port':9200}])
def match_phrase(url):
res = es.search(index="yu", body={'query':{'match_phrase':{'domain':url}}})
result = []
for de in res['hits']['hits']:
result.append(de['_source'])
return result
print match_phrase('SHA256WithRSA')