??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品麻豆av,亚洲欧洲日产国码久在线,亚洲国产日韩在线http://www.tkk7.com/agun/archive/2008/04/23/195086.htmlagunagunWed, 23 Apr 2008 06:46:00 GMThttp://www.tkk7.com/agun/archive/2008/04/23/195086.htmlhttp://www.tkk7.com/agun/comments/195086.htmlhttp://www.tkk7.com/agun/archive/2008/04/23/195086.html#Feedback0http://www.tkk7.com/agun/comments/commentRss/195086.htmlhttp://www.tkk7.com/agun/services/trackbacks/195086.html PostgreSQL 8.3.1  全文?/strong>

在postgreSQL 8.3自带支持全文索功能,在之前的版本中需要安装配|tsearch2才能使用Q安转配|tsearch2׃再多说了Q主要介l一?.3中自带全文检索功能?/p>

全文索类?Text Search Types)

postgreSQL设计支持全文索,提供两个数据cdQtsvector,tsqueryQ,q且通过动态检索自然语a文档的集合,定位到最匚w的查询结果?/p>

tsvector

一个tsvector的值是唯一分词的分cd表,把一话一句词格式化ؓ不同的词条,在进行分词处理的时?br /> tsvector会自动去掉分词中重复的词条,按照一定的序装入。例?/p>

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
                      tsvector
----------------------------------------------------
 'a' 'on' 'and' 'ate' 'cat' 'fat' 'mat' 'rat' 'sat'

从上面的例子可以看出 Q通过tsvector把一个字W串按照I格q行分词Q分词的序是按照长短和字母来排序的。但是某些时候,我们Z让词条中包含I格或者符P需要对其用引受?br /> SELECT $$the lexeme '    ' contains spaces$$::tsvector;
                 tsvector                 
-------------------------------------------
 'the' '    ' 'lexeme' 'spaces' 'contains'

Z使用引号Q我们可以用双$$W号来避免؜淆?br /> q且词条位置帔R可以附属于每个词?例如Q?br /> SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
                                  tsvector
-------------------------------------------------------------------------------
 'a':1,6,10 'on':5 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4

q个位置信息通常是当前文档中单词所处的位置Q这个位|信息用于关注度的体现。位|信息常量的值的范围? ?16383。分词后Q会把相同词条的位置记录C个词条中。(如上所C)?br /> 词条通过权重可以使其所在位|促q它的标记。权重分为A,B,C,D,D为默认值可以不昄.

权重用于关系,体现文档l构是很有特色地.例如,通俗一?是相同的词?但是词条所在位|的权重不一?在一个文档中,标题和文本内?在做全文索排序功能时需要分配给q两个词不同的优先权,不同的权重标?

理解tsvectorcd是很重要?不能只关注标准的应用.例如
select 'The Fat Rats'::tsvector;
      tsvector     
--------------------
 'Fat' 'The' 'Rats'
但是对于英文全文索应用来?上面的句子就是非标准化的,但是tsvector是不会知道的,为处理加工的文本应该通过使用to_tsvector函数来是之规格化,标注化的应用于搜?

SELECT to_tsvector('english', 'The Fat Rats');        
   to_tsvector  
-----------------
 'fat':2 'rat':3


tsquery

֐思义,tsquery,表示的应该是查询相关?tsquery是存储用于检索的词条.q且可以联合使用boolean 操作W来q接, & (AND), | (OR), and ! (NOT). 使用括号(),可以强制分ؓ一l?


 SELECT 'fat & rat'::tsquery;
    tsquery   
---------------
 'fat' & 'rat'

SELECT 'fat & (rat | cat)'::tsquery;
          tsquery         
---------------------------
 'fat' & ( 'rat' | 'cat' )

SELECT 'fat & rat & ! cat'::tsquery;
        tsquery        
------------------------
 'fat' & 'rat' & !'cat'
同时,tsquery 在做搜烦的时?也可以用权?q且每个词都可以使用一个或者多个权重标?q样在检索的时?会匹配相同权重的信息.
跟上面的tsvector ,相同tsquery也有一个to_tsquery函数.

全文索的 document

document是全文索的搜烦单元,在postgresql中全文检索匹配操作用@@ 操作W?如果一?br /> tsvector(document) 匚w?tsquery(query)则返回true.

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery;
 ?column?
----------
 t
我们在处理烦引的时候还是要使用他们的函数如,
SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');
 ?column?
----------
 t
q且操作W?@@ 可以使用text作ؓtsvector和tsquery.如下操作W可以使用的方?/p>

tsvector @@ tsquery
tsquery  @@ tsvector
text @@ tsquery
text @@ text
上面的前两种我们已经使用q了,但是后两U?
text @@ tsquery {同?to_tsvector(x) @@ y.
?text @@ text {同?to_tsvector(x) @@ plainto_tsquery(y).

表和索引

前面介绍了如何在单文本中q行全文索匹?下面部分介l如何检索表数据和用烦?

索一个表

在全文检索中不用烦引也是可以进行检索的,例如下面的简单例?查询出title 从所有body中包含friend的行.

SELECT title
FROM pgweb
WHERE to_tsvector('english', body) @@ to_tsquery('english', 'friend');

复杂一点的例子:
索出最q的10个文?在表中的title ?body字段中包?creat和table的titile.
SELECT title
FROM pgweb
WHERE to_tsvector(title || body) @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC LIMIT 10;

建立索引

我们可以通过创徏gin索引来加速检索速度.例如

CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', body));

创徏索引可以有多U方?索引的创建甚臛_以连接两个列:
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', title || body));
另外的一U方式是创徏一个单独的 tsvector?然后使用to_tsvector函数把需要烦引字D늚数据联合在一P比如列title和bodyQƈ且用函数coalesce来确保字DؓNULL的可以徏立烦引?br /> 如下Q?br /> ALTER TABLE pgweb ADD COLUMN textsearchable_index_col tsvector;
UPDATE pgweb SET textsearchable_index_col =
     to_tsvector('english', coalesce(title,'') || coalesce(body,''));
然后Q我们就可以创徏倒排的烦?br /> CREATE INDEX textsearch_idx ON pgweb USING gin(textsearchable_index_col);
索引创徏完毕Q我们就可以使用全文索了?br /> SELECT title
FROM pgweb
WHERE textsearchable_index_col @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC LIMIT 10;

 

控制全文?Controlling Text Search)

Z实现全文索,我们需要把一个文档创Z个tsvector 格式Qƈ且通过tsquery实现用户的查询?br /> 因此Q在查询中我们返回一个按照重要性排序的查询l果?/p>

分析文档(Parsing Documents)

postgresql 中提供了to_tsvector函数把文档处理成tsvector数据cd。(前面已经介绍q了Q?br /> q个函数会将文本文档Q分解成唯一的词条,q且q包括词条所在文本中的位|。(q里to_tsvector函数׃再多做介l了Q?br /> 其实在做分词是很重要的步骤,分词的操作直接关pd你的后来索的l果。(后面再重要描qͼ
在postgreSQL中默认的to_tsvectorQ?english',Q配|默认的是英语?br /> postgre 中还有一个函?setweight Q要使用q个函数我们要引入一个概念,q个概念是权重weightQ什么是权重呢,字面上解释就是权衡一下哪个更重要Q也是说哪个更侧重一些。我们可以通过函数setweight来设|权重,postgre提供了四个AQBQCQD来分别表CZ同权重别,q个U别cd用来标记他们来自于文档中的不同部分,例如title和body。查询结果的x度可以用这个权重别。如Q?br /> UPDATE tt SET ti =
    setweight(to_tsvector(coalesce(title,'')), 'A')    ||
    setweight(to_tsvector(coalesce(keyword,'')), 'B')  ||
    setweight(to_tsvector(coalesce(abstract,'')), 'C') ||
    setweight(to_tsvector(coalesce(body,'')), 'D');

搜烦分析(Parsing Queries)

postgreSQL中提供了to_tsquery函数和plainto_tsquery函数Q来处理分析搜烦语句?/p>

SELECT to_tsquery('english', 'The & Fat & Rats');
  to_tsquery  
---------------
 'fat' & 'rat'

在搜索中tsquery中可以用权重(weightQ?在搜索词条中可以附加权重Qƈ且匹配出来的查询l果也是必须在这个这个权重范围的?/p>

SELECT to_tsquery('english', 'Fat | Rats:AB');
    to_tsquery   
------------------
 'fat' | 'rat':AB

从上面的例子可以看出Qto_tsquery函数在处理查询文本的时候,查询文本的单个词之间要用逻辑操作W(& (AND), | (OR) and ! (NOT)Q连接(或者用括P。例?跟上面的例子怼

SELECT to_tsquery('english', 'Fat  Rats');

如果要执行上面的操作,׃报语法错误?br /> 然而plainto_tsquery函数却可以提供一个标准的tsqueryQ如上面的例子,plainto_tsquery会自动加上逻辑&操作W?br /> SELECT plainto_tsquery('english', 'Fat  Rats');

 plainto_tsquery
-----------------
 'fat' & 'rat'
但是plainto_tsquery函数不能够识别逻辑操作W和权重标记?br /> SELECT plainto_tsquery('english', 'The Fat & Rats:C');
   plainto_tsquery  
---------------------
 'fat' & 'rat' & 'c'

查询l果x?Ranking Search Results)

相关度,是试图试衡量哪一个文档是索中最x的。因此我们把最匚w的文档现在在最前面。这h能真正达到检索的准确度,postgresql提供两个相关的函敎ͼts_rank和ts_rank_cd.
q两个函数的语法?br /> ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4

ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4

两个函数的第一个参数都?权重(weight)Q在前面已经讲了权重的概c?br /> 参数的格式ؓ {D-weight, C-weight, B-weight, A-weight} Q在使用函数的时候没有指定这个参敎ͼpostgre会默认指定参CؓQ{0.1, 0.2, 0.4, 1.0}
q个参数应该理解为:单前索的关键词(词条Q在当前q个索文档中的位|,如果q个词条在这个当前的位置权重高,那么他的相关度的g会高?br /> 另外函数的最好一个参数是一个整型,q个参数是表C,q个参数指定文档大小影响相关度的E度?br /> 你可以指定一个或者多个例如(2|4Q?br /> q些参数的定?/p>

0 (the default) ignores the document length
表示跟长度大没有关p?br /> 1 divides the rank by 1 + the logarithm of the document length
表示参数 x度(rankQ除?文档长度的对?1
2 divides the rank by the document length
表示 x?除以 文档的长?br /> 4 divides the rank by the mean harmonic distance between extents (this is implemented only by ts_rank_cd)
表示 x?除以 文档长度的^均|只能使用函数ts_rank_cd.
8 divides the rank by the number of unique words in document
表示 x?除以 文档?唯一分词的数?br /> 16 divides the rank by 1 + the logarithm of the number of unique words in document
表示x?除以 唯一分词数量的对?1
32 divides the rank by itself + 1
表示 x?除以 本n+1


其他的一些特?/strong>

       length(vector tsvector) returns integer
    q个函数q回当前索引字段的分词长度,是分词的个?/p>

       strip(vector tsvector) retzitor
q个函数q回当前索引字段的数据不包括词的位置


自动更新处理的触发器(Triggers for Automatic Updates)

在我们作全文索的时候,当我们用单独的列来存储索引文g的时候,我们一定需要创Z个触发器Q当涉及索引字段的其他列的内Ҏ(gu)变的时候,索引文g也要相应的改变,postgre提供两个触发器可以实现该功能Q也可以自定义触发器?/p>

q两个触发器的ؓQ?br />     tsvector_update_trigger(tsvector_column_name, config_name, text_column_name [, ... ])
    tsvector_update_trigger_column(tsvector_column_name, config_column_name, text_column_name [, ... ])

q个函数可以自动把一个或者多个文本字D,计算生成索引字段。例?/p>

我们创徏一个表
CREATE TABLE messages (
    title       text,
    body        text,
    tsv         tsvector//索引字段
);

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON messages FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv, 'pg_catalog.english', title, body);
创徏触发器,字段title和body都是文本字段Q他们烦引后的字Dؓtsv,q里使用postgre自带的分词规则pg_catalog.english?br /> 向表中插入一条数据?br /> INSERT INTO messages VALUES('title here', 'the body text is here');

SELECT * FROM messages;
   title    |         body          |            tsv            
------------+-----------------------+----------------------------
 title here | the body text is here | 'bodi':4 'text':5 'titl':1
可以看到tsv字段自动加入的数据,q且l过tsvector处理?br /> 接下来我们测试一下检?br /> SELECT title, body FROM messages WHERE tsv @@ to_tsquery('title & body');
上面q个查询Q查不到l果?br /> SELECT title, body FROM messages WHERE tsv @@ to_tsquery('english','title & body');
   title    |         body         
------------+-----------------------
 title here | the body text is here
注意: 看上面的查询条gQ在q行全文索的时候,在创建烦引时Q用的分词方式Q与索时使用的分词方式一定要惛_Q否则查询的l果׃有问题?/p>

创徏触发器后Q不论title或者body那个字段改变Q都会自动反给tsv,索引会自动更新?/p>

上面q中自带的触发器很有局限性,比如_在徏立烦引的时候title和body要有不同的权重,上面的触发器p辑ֈ我们惌的效果,下面是一?pl/pgsql 触发器?/p>

CREATE FUNCTION messages_trigger() RETURNS trigger AS $$
begin
  new.tsv :=
     setweight(to_tsvector('pg_catalog.english', coalesce(new.title,'')), 'A') ||
     setweight(to_tsvector('pg_catalog.english', coalesce(new.body,'')), 'D');
  return new;
end
$$ LANGUAGE plpgsql;

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON messages FOR EACH ROW EXECUTE PROCEDURE messages_trigger();

索引l计函数

 ts_stat(sqlquery text, [ weights text, ] OUT word text, OUT ndoc integer, OUT nentry integer)

q回的是l计的纪?/p>

word text ?索引中的词条

ndoc integer ?词条在烦引中出现的次?/p>

nentry integer ?词条在文档中出现的L?/p>

例如Q?/p>

SELECT * FROM ts_stat('SELECT tsv FROM messages')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;

查询的结果ؓ

  word     ndoc  nentry

  test     2      3
  title    2      2
  test     1      2
  body     1      1

上面可以看到Q通过ts_stat函数可以看到烦引列中的分词的情c?/p>

 

词典(Dictionaries)

词典是被用来过滤掉一些不被关注的词(在检索的时候)Qƈ且对词句规格化,是ؓ了相同的词在不同的来源的文档中可以被匚w。一个成功分词(格式化的Q的词称条。除了能提高?gu)索的质量外,分词的规格化Q过滤词Q还能够减少文档索引的大,q样可以提高性能。标准化的词也不能LW合语言学意义,q且L依赖于应用所在的环境?br /> 单D例:
例如一些颜色名Uͼ会被替换成其相对应?6q制的|?red,green,blue ->FF0000, 00FF00, 0000FF {?br /> 如果要制定小敎ͼ我们可以L一些小数的位数Q来减少范围。如 3.14159265359 ,3.1415926,q两个小数如果是保留数点后两位数Q那么格式化后他们的值将都是 3.14?/p>

postgresql提供了一些预定义的词兔R向多U语a的,q且q有几个预定义的模版Q可以根据用L需要自定义词典?/p>

屏蔽?Stop Words)
stop words 是一个很普遍q且在每个文档中几乎都能出现的的词,q且q个词没有实际的意义Q因此在全文索的文档中他么将被忽略。例?英文文本内容中单??a 和likeQ他们不需要存储在索引中,但是他会影响词所在文档的位置?br /> SELECT to_tsvector('english','in the list of stop words');
        to_tsvector
----------------------------
 'list':3 'stop':5 'word':6
q且相关度的计算与是否存在stop words是十分不同的,?
SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list & stop'));
 ts_rank_cd
------------
       0.05

SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list & stop'));
 ts_rank_cd
------------
        0.1

单词?br />
使用单词?自定义词??

CREATE TEXT SEARCH DICTIONARY public.simple_dict (
    TEMPLATE = pg_catalog.simple,
    STOPWORDS = english
);

上面例子中的 english是表C的stop words的名?q个stop words的全名因该是$sharedir/tsearch_data/english.stop,$sharedir也就是postgresql的安装目录下.现在我们使用一下新建的词典.?
SELECT ts_lexize('public.simple_dict','YeS');
 ts_lexize
-----------
 {yes}

SELECT ts_lexize('public.simple_dict','The');
 ts_lexize
-----------
 {}
q有几个postgresql中自带的词典, Simple Dictionary,Synonym Dictionary
,Thesaurus Dictionary
,Ispell Dictionary
,Snowball Dictionary
q里不再详细介绍?

 


全文索的试和调?br />

ts_debug函数用来调试全文索的

q个函数昄的是文档的每个词条通过基本词典的分析和处理的信息?br /> q个函数q回的信息ؓQ?br /> alias text ?short name of the token type
文本别名-词的cd名称
description text ?description of the token type
描述-描述词的cd
token text ?text of the token
词内?词的文本内容
dictionaries regdictionary[] ?the dictionaries selected by the configuration for this token type
词典-词的配置所选择的词?br /> dictionary regdictionary ?the dictionary that recognized the token, or NULL if none did
词典
lexemes text[] ?the lexeme(s) produced by the dictionary that recognized the token, or NULL if none did; an empty array ({}) means it was recognized as a stop word
处理后的词条

Here is a simple example:

SELECT * FROM ts_debug('english','a fat  cat sat on a mat - it ate a fat rats');
   alias   |   description   | token |  dictionaries  |  dictionary  | lexemes
-----------+-----------------+-------+----------------+--------------+---------
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | cat   | {english_stem} | english_stem | {cat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | sat   | {english_stem} | english_stem | {sat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | on    | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | mat   | {english_stem} | english_stem | {mat}
 blank     | Space symbols   |       | {}             |              |
 blank     | Space symbols   | -     | {}             |              |
 asciiword | Word, all ASCII | it    | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | ate   | {english_stem} | english_stem | {ate}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | rats  | {english_stem} | english_stem | {rat}


分析器测?ts_parse)

ts_parse函数分析文档q且q回一串记录,每一个解析后的词都有一个tokidQ和的分词。如

SELECT * FROM ts_parse('default', '123 - a number');
 tokid | token
-------+--------
    22 | 123
    12 |
    12 | -
     1 | a
    12 |
     1 | number


gist ?gin的烦引类?GiST and GIN Index Types)

q两U烦引都能用在提高全文检索的速度Q注意全文检索不一定非要用烦引,但是万一当一个字D被固定规律搜烦Ӟ使用索引会有很好的效果?/p>

CREATE INDEX name ON table USING gist(column);
创徏索引 gist 索引字段的类型可以是 tsvector 或?tsquery.
 
CREATE INDEX name ON table USING gin(column);
创徏索引 gin 索引字段的类型必L tsvector;

 



agun 2008-04-23 14:46 发表评论
]]>
POSTGIS常用函数http://www.tkk7.com/agun/archive/2008/03/24/188289.htmlagunagunMon, 24 Mar 2008 08:46:00 GMThttp://www.tkk7.com/agun/archive/2008/03/24/188289.htmlhttp://www.tkk7.com/agun/comments/188289.htmlhttp://www.tkk7.com/agun/archive/2008/03/24/188289.html#Feedback2http://www.tkk7.com/agun/comments/commentRss/188289.htmlhttp://www.tkk7.com/agun/services/trackbacks/188289.htmlManagement Functions

1,基本操作函数


AddGeometryColumn(<schema_name>, <table_name>, <column_name>, <srid>, <type>, <dimension>)
l一个已存在属性数据表增加一个几何字D?geomtry column)。schema_name 指表的模式的名字Qsrid 必须是一个整数指对应?SPATIAL_REF_SYS 表,type必须是一个大写的字符Ԍ用来描述几何cdQ例如:'POLYGON' 或?'MULTILINESTRING'?/p>

DropGeometryColumn(<schema_name>, <table_name>, <column_name>)
从一个空间数据表中删除一个几何字Dc?/p>

ST_SetSRID(geometry, integer)
l一个几何对?geometry)讄一个整型的SRIDQ对于在一个范围内的查询非常有用?nbsp;
 
2. Geometry Relationship Functions
   几何I间数据关系函数

ST_Distance(geometry, geometry)
q回两个几何对象的距(W卡儿距)Q不使用索引?nbsp;
 
ST_DWithid(geometry, geometry, float)
如果一个几何对?geometry)在另一个几何对象描q的距离(float)内,q回TRUE。如果有索引Q会用到索引?

ST_Equals(geometry, geometry)
如果两个I间对象相等Q则q回TRUE。用q个函数比用“=”更好Q例如:
equals('LINESTRING(0 0, 10 10)','LINESTRING(0 0, 5 5, 10 10)') q回 TRUE?/p>

ST_Disjoint(geometry, geometry)
如果两个对象不相q,则返回TRUE。不要用GeometryCollection作ؓ参数?br />
ST_Intersects(geometry, geometry)
判断两个几何I间数据是否怺,如果怺q回true,不要使用GeometryCollection作ؓ参数?br /> Intersects(g1, g2 ) --> Not (Disjoint(g1, g2 ))
不用烦引可以用_ST_Intersects.

ST_Touches(geometry, geometry)
如果两个几何I间对象存在接触Q则q回TRUE。不要用GeometryCollection作ؓ参数?br /> a.Touches(b) -> (I(a) intersection I(b) = {empty set} ) and (a intersection b) not empty
不用烦引可以用_ST_Touches.

ST_Crosses(geometry, geometry)
如果两个几何I间对象存在交叉Q则q回TRUE。不要用GeometryCollection作ؓ参数?br /> 不用烦引可以用_ST_Crosses.

ST_Within(geometry A, geometry B)
如果几何I间对象A存在I间对象B?则返回TRUE,不要使用GeometryCollection作ؓ参数?br /> 不用烦引可以用_ST_Within

ST_Overlaps(geometry, geometry)
如果两个几何I间数据存在交P,则返?TRUE,不要使用GeometryCollection作ؓ参数?br /> 不用烦引可以用_ST_Overlaps.

ST_Contains(geometry A, geometry B)
如果几何I间对象A包含I间对象B,则返?TRUE,不要使用GeometryCollection作ؓ参数?br /> q个函数cM于ST_Within(geometry B, geometry A)
不用烦引可以用_ST_Contains.

ST_Covers(geometry A, geometry B)
如果几何I间对象B中的所有点都在I间对象A?则返?TRUE?br /> 不要使用GeometryCollection作ؓ参数?br /> 不用烦引可以用_ST_Covers.

ST_CoveredBy(geometry A, geometry B)
如果几何I间对象A中的所有点都在I间对象B?则返?TRUE?/p>

3,Geometry Processing Functions
几何I间数据处理函数

ST_Centroid(geometry)
q回质心?是Ҏ(gu)几何I间数据,zd该几何空间数据的中心?q回一个空间点数据.

ST_Area(geometry)
如果几何I间数据为多边Ş,或者多多边?则返回空间数据的外围(q回cddouble precision) ;

ST_Length(geometry)
q个曲线在其相关的空间参考长?q回cddouble precision) ;

ST_PointOnSurface(geometry)
一定在几何I间U数据上的点Q返回一个数据点

ST_Buffer(geometry, double, [integer])
buffer操作一个很有用函数Q?br /> q个函数的第一个参数是要操作的I间几何数据Q第二个参数长度Q距)Q第三个参数Z个整型,
q个函数q回一个空间数据类型,以当前第一个参数空间几何数据ؓ参考点Q返回小于等于距ȝI间

几何数据点,最后由q些点组成一个多边ŞI间数据Q最后一个参数表C?br /> 在组成一?/4圆的有几个点分隔。也是说如果最好一个参Cؓ8那么q个最后组成的多边形就?2?/span>

的多边ŞQ如果不指定q个参数Q系l默认的?
注意Q第二个参数Q距d的单位ؓI间数据单位Q度Q,在运时需要进行单位换,最后{换成?/span>

Q单位的换算关系如下Q?br /> 1英里= 63360 c?br /> 1c?1/1852 里
1里= 1/60?br /> 如果要进行具体的q算Q需要进行一下单位换,比如要求一?00c的范围Q那么应该是

500*1/1852*1/60Q度Q?/span>

ST_Envelope(geometry)
q个函数可以q回mbr(I间最外包矩?Q传入参数可以是point line polygon?/span>


ST_extent(geometry set)
q个函数可以对一个空间数据集q行操作Q返回一个最包含矩形(mbrQ?
如:SELECT EXTENT(GEOM) FROM GEOMTABLE GROUP BY CATEGORY


ST_Difference(geometry A, geometry B)
q回一个几何空间数据A不同于空间数据B的几何空间数据类型,不要使用GeometryCollection作ؓ参数?br /> 也就是说Q如果AZ个line,B也ؓ一个lineQ那么他们返回的cd是B把A分割的多Uѝ?br /> 如:
select ST_AsEWKT(ST_Difference(geomfromText('LINESTRING(1 1,2 3,3 4,3 1)'),geomfromText('LINESTRING(2 0,2 2,5 2,3 1)')))
q回的MULTILINESTRING((1 1,2 3,3 4,3 2),(3 2,3 1))
如果是A和B都是一个POLYGON多边形,那么q回的就是多多边形,如果怺Q那么返回的是B把A分割Qƈ且不再B中的多多边Ş?br /> select ST_AsEWKT(ST_Difference(geomfromText('POLYGON((1 1,2 3,3 4,3 1,1 1))'),geomfromText('POLYGON((2 0,2 2,5 2,1 3,2 0))')))

ST_Union(geometry, geometry)
q回一个合q的几何I间数据Q将两个几何I间数据合ƈZ个几何空间数据,或者GeometryCollectionQ不要用GeometryCollection作ؓ参数?/p>


4 QGeometry Accessors

ST_AsText(geometry)
几何空间数据,转换成容易理解的I间数据文本格式Q?br /> 例如Q?br /> (0,0 0,1 1,1 1,0 0,0)
转换后应该是q样的结?POLYGON(0 0,0 1,1 1,1 0,0 0)

ST_SRID(geometry)
q回当前几何I间数据的SRID?/p>

ST_IsClosed(geometry)
判断几何I间数据是否是闭合,是判断起始点和l点坐标是相同的Q如果是相同的返回true,否则q回false.

ST_IsRing(geometry)
q个函数参数的对象是lineQ判断v始点和终点坐标是否相同,
如果闭合(q个曲线除了起始点和l点相同外,没有其他怺?怎返回true,否则false,

ST_NumPoints(geometry)
q回几何I间数据lineString上的W一条线上点的个数?/p>


GeometryType(geometry)
判断几何I间数据的类型?br /> 例如
select GeometryType(geomfromText('MULTILINESTRING((1 1,2 3,3 4,3 1,2 1,1 1),(1 2,2 3,4 5))'))
q回的类型ؓ MULTILINESTRING?/p>


 



agun 2008-03-24 16:46 发表评论
]]>
索引的?/title><link>http://www.tkk7.com/agun/archive/2008/03/11/185384.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 11 Mar 2008 07:07:00 GMT</pubDate><guid>http://www.tkk7.com/agun/archive/2008/03/11/185384.html</guid><wfw:comment>http://www.tkk7.com/agun/comments/185384.html</wfw:comment><comments>http://www.tkk7.com/agun/archive/2008/03/11/185384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/agun/comments/commentRss/185384.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/agun/services/trackbacks/185384.html</trackback:ping><description><![CDATA[<p>索引的简单用说明:<br /> <br /> 一.常用扫描方式Q?br /> .全表扫描 <br />  全表扫描是序地访问表中每条记? <br /> .索引扫描  <br /> 索引唯一扫描(index unique scan) <br /> 索引范围扫描(index range scan) <br /> 索引全扫?index full scan) <br /> 索引快速扫?index fast full scan)  </p> <p>1.索引唯一扫描(index unique scan) <br /> 通过唯一索引查找一个数值经常返回单个ROWID。如果该唯一索引有多个列l成(即组合烦?Q则臛_要有l合索引的引导列参与到该查询中,如创建烦引:create index index_test on building(name,status)?br /> 如:语句Q?br /> select id from building where name='国际U技大厦'<br /> 此语句可以用该索引。如果该语句只返回一行,则存取方法称为烦引唯一扫描?br /> 而语句:<br /> select name from building where status ='1'<br /> 因ؓwhere条g没有用到索引的引导列。所以烦引不生效?/p> <p>2.索引范围扫描(index range scan) <br /> 使用一个烦引存取多行数据,同上面一P如果索引是组合烦?br /> ?select id from building where name like 'H%' and status='1' 语句q回多行数据Q此时的存取Ҏ(gu)UCؓ索引范围扫描?br /> 使用index rang scan?U情况: <br /> (a) 在唯一索引列上使用了range操作W?> < <> >= <= between) <br /> (b) 在组合烦引上Q只使用部分列进行查询,D查询出多?<br /> (c) 寚w唯一索引列上q行的Q何查询?</p> <p>3. 全烦引扫?index full scan) <br /> SQLh的全部列QcolumnQ必驻留在索引树中Q也是_SELECT和WHERE字句中的所有数据列必须存在于烦引中。ƈ且排序返回?</p> <p>4.索引快速扫?index fast full scan) <br /> 扫描索引中的所有的数据块,?index full scan很类|但是一个显著的区别是它不Ҏ(gu)询出的数据进行排序,x据不是以排序序被返回?/p> <p> </p> <p>?什么情况下应该建立索引<br /> 1.表的d键字(建立唯一索引)<br /> 2.表的字段唯一U束<br /> 3.直接条g查询的字D?在SQL中用于条件约束的字段<br /> 4.查询中与其它表关联的字段,字段常常建立了外键关p?br /> 5.查询中排序的字段<br /> 6.查询中统计或分组l计的字D?/p> <p>?什么情况下应不建或徏索引<br /> 1.表的记录很少<br /> 2.对一些经常处理的业务表应在查询允许的情况下尽量减烦?br /> 3.数据重复且分布^均的表字D?br /> 假如一个表?0万行记录Q有一个字DA(ch)只有T和F两种|且每个值的分布概率大约?0%Q那么对q种表A字段建烦引一般不会提高数据库的查询速度</p> <p>?索引应用注意事项<br /> 1. IS NULL ?IS NOT NULL <br /> 不能用null作烦引,M包含null值的列都不会被包含在烦引中。即使烦引有多列q样的情况下Q只要这些列中有一列含有nullQ该列就会从索引中排除。也是说如果某列存在空|即对该列徏索引也不会提高性能?M在where子句中用is null或is not null的语句优化器是不允许使用索引的?/p> <p>2.带通配W(%Q的like语句 <br /> 如: select * from building where name like '%中心%'<br /> name为building表的索引Q则此烦引就不会生效Q这里由于通配W(%Q在搜寻词首出现Q通配W如此用会降低查询速度。然而当通配W出现在字符串其他位|时Q优化器p利用索引<br /> select * from building where name like '&中心%'</p> <p>3. Order by语句 <br />   ORDER BY语句军_了如何将q回的查询结果排?M在Order by语句的非索引Ҏ(gu)者有计算表达式都降低查询速度。order by后面的排序字D尽量用烦引字Dc?/p> <p>4.'<>'的用?br /> 例如Q?br /> select * from building where id<>5000;<br /> select * from building where id>5000 or id<5000<br /> l果一P但是W二句id索引生效?/p> <p>5.可以使用外部q接优化not in子句Q例如:<br /> select name from building where fk_building in (select deptid from test where name='test' and ifdeleted=0);<br />   <br /> 改ؓQ?br /> select name from building a,test b where a.fk_building=b.id and b.name='test' and ifdeleted=0;</p> <p>6.索引列是否函数的参数。如是,索引在查询时用不上?/p> <p>7.M表关联方?br /> 如果Qbuilding.id上有一索引<br /> 在district.id上有索引<br /> 如:<br /> select contract_code from building a,district b where a.id=b.id<br /> building.id上的索引׃生效<br /> 反之同理?/p> <p><br /> 8.是否存在潜在的数据类型{换。如字W型数据与数值型数据比较QORACLE会自动将字符型用to_number()函数q行转换Q从而导致上一U现象的发生?/p> <p><br /> 9.索引应用的优先Q?/p> <p>(1).唯一性烦引的{高于非唯一性烦? q个规则只有当WHERE子句中烦引列和常量比较才有效.如果索引列和其他表的索引cȝ比较. q种子句在优化器中的{是非怽?</p> <p>(2).如果多个索引在一个查询中都可应用Q那么如果条件中应用索引和常量进行比较,那么q个索引先被利用?/p> <p><br /> 10.语句的执行计划中有不良烦引时Q可以h为地屏蔽该烦引,Ҏ(gu)Q?br />   <br />   。数值型Q在索引字段上加0Q例?br />   select * from building where id+0 = 0;<br />   <br />   。字W型Q在索引字段上加‘’Q例?br />   select * from building where name||’’='test';</p> <p> </p> <p> </p> <p> </p> <img src ="http://www.tkk7.com/agun/aggbug/185384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/agun/" target="_blank">agun</a> 2008-03-11 15:07 <a href="http://www.tkk7.com/agun/archive/2008/03/11/185384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>postgre存储q程单实用方?Q过E语aQ?PL/pgSQLQ?/title><link>http://www.tkk7.com/agun/archive/2008/03/06/184131.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Thu, 06 Mar 2008 01:12:00 GMT</pubDate><guid>http://www.tkk7.com/agun/archive/2008/03/06/184131.html</guid><wfw:comment>http://www.tkk7.com/agun/comments/184131.html</wfw:comment><comments>http://www.tkk7.com/agun/archive/2008/03/06/184131.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/agun/comments/commentRss/184131.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/agun/services/trackbacks/184131.html</trackback:ping><description><![CDATA[<p>postgre存储q程单实用方?Q过E语aQ?PL/pgSQLQ?/p> <p>一Q介l常用的PL/pgSQLl构和语法:<br /> 1Q结?<br /> PL/pgSQL是一U块l构的语aQ比较方便的是用pgAdmin III新徏FunctionQ填入一些参数就可以了。基本上是这LQ?br /> CREATE OR REPLACE FUNCTION 函数?参数1Q[整型 int4, 整型数组 _int4, …])<br /> RETURNS q回值类?AS<br /> $BODY$<br /> DECLARE<br /> 变量声明<br /> BEGIN<br /> 函数?br /> END;<br /> $BODY$<br /> LANGUAGE ‘plpgsql’ VOLATILE; </p> <p>2Q变量类?除了postgresql内置的变量类型外Q常用的q有 RECORD Q表CZ条记录?br /> 赋?Q?#8220;变量 := 表达?”<br /> q接字符串的?#8220;||”Q比?sql := ‘SELECT * FROM’ || table || ‘WHERE …’;<br /> 3Q判?<br /> IF 条g THEN<br /> …<br /> ELSEIF 条g THEN<br /> …<br /> ELSE<br /> …<br /> END IF;<br /> 4Q@?循环有好几种写法Q?br /> WHILE expression LOOP<br /> statements<br /> END LOOP;<br /> q有常用的一U是Q(?循环?可以写成FOR i IN 1..9 LOOPQ?br /> FOR name IN [ REVERSE ] expression .. expression LOOP<br /> statements<br /> END LOOP;</p> <p>?跟mysqlҎ(gu)?/p> <p><br /> 1Qpostgre 中的limit不支持LIMIT #,# q样的语法?/p> <p>而是支持 LIMIT and OFFSET clauses 语法</p> <p>mysql上面的两U方式都支持?br /> 2Q存储过E中在ibatis中的使用Q?/p> <p>(1)Qmysql存储q程可以直接q回l果集,同时可以有out参数<br /> 例如Q?br /> 存储q程Q?br /> CREATE  PROCEDURE `test`<br /> (IN _login VARCHAR(32), <br /> IN _psw VARCHAR(32), <br /> OUT _ret INTEGER(10),<br />  OUT _id INTEGER(10), <br /> OUT _name VARCHAR(32), <br /> OUT _email VARCHAR(32), <br /> OUT _phone VARCHAR(20), <br /> OUT _active INTEGER(11))//同时q回多个l果集合 </p> <p>BEGIN<br />     DECLARE CONTINUE HANDLER FOR NOT FOUND set _ret =-1;<br />     set _ret = 0 ;</p> <p>    select id,name,email,phone,active<br />     into _id,_name,_email,_phone,_active<br />     from test<br />     where tx_account.`loginname`=_login and tx_account.`password`=MD5(_psw) and active=1;<br />     ---------q回l果?----<br />     if _ret = 0 then<br />        select a.id as id ,a.name as name,a.priority as priority<br />        from test b left join test1 a on b.role=a.id<br />        where b.account=_id;<br />     end if;<br /> END;<br /> 直接q回l果?br /> ibatis文g<br />   <parameterMap id="testParameterMap" class="params"><br />     <parameter property="loginname" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/><br />     <parameter property="password" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/><br />     <parameter property="ret" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/><br />     <parameter property="id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>    <br />     <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/><br />     <parameter property="phone" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/><br />     <parameter property="email" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/><br />     <parameter property="active" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/><br />   </parameterMap><br />   <br />   <procedure id="test" parameterMap="testMap" resultMap="AccountRoleResultMap"><br />     {call test(?,?,?,?,?,?,?,?)}<br />   </procedure> <br />    <br /> dao 的实?br /> 定义一个传参的map params ,</p> <p>  HashMap<String,Object> params = new HashMap<String,Object>();<br />   //把需要的参数攑ֈmap?br />   params.put("id",account.getId());<br />   params.put("ret",null);<br />   params.put("loginname", null);<br />   params.put("name", null);<br />   params.put("email", null);<br />   params.put("phone",null);<br />   params.put("active", null);<br />   定义一个list <br />   List list=null;<br />    list= (List)(getSqlMapClientTemplate().queryForList("test",params));<br />   //上面q样操作可以获得存储过E返回的l果集?nbsp;<br />    Object var; <br />    var = params.get("ret");//从map 中获得制定的输出参数的倹{?br /> 在mysql中不需要的ibatis的配|文件中Q声明返回的l果集?br /> (2) postgre的函数返回结果集<br /> 在postgre中返回结果集一定要在ibatis中定义输出参数?br />   Ҏ(gu)1Q不能输出参敎ͼ使用直接q游标的Ҏ(gu)<br /> 例如Q?br /> 函数Q?br /> CREATE OR REPLACE FUNCTION test(IN _login VARCHAR(32))//只有输入参数<br />   RETURNS <br />   refcursor //制定q回cd为游标?br />   AS<br /> $BODY$<br /> declare video_cur refcursor;<br /> BEGIN</p> <p>       open video_cur for<br />  select id , title from test;<br />        return video_cur ;//q回游标<br /> END<br /> $BODY$<br />   LANGUAGE 'plpgsql' VOLATILE;<br /> ALTER FUNCTION test(integer) OWNER TO postgres;<br /> ibatis文g</p> <p>    <parameterMap id="testParameters" class="java.util.HashMap"><br />         <parameter property="result" jdbcType="OTHER" javaType="java.sql.ResultSet" mode="OUT"/>//q回l果?br />         <parameter property="loginName" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/><br />         <parameter property="loginPasswd" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/><br />     </parameterMap><br />     <br />     <procedure id="test" resultMap="testResultMap" parameterMap="testParameters" ><br />          {? = call test(?,?)}<br />     </procedure><br />     <br /> 上面的map文g描述?个参?按照调用方式: ? = call test(?, ?)的顺序,<br /> W一个参数是q回l果集的Q这里的jdbcType填写OTHERQjavaType填写java.sql.ResultSetQ?br /> 如果是ORACLE的存储过E通过游标q回l果集的话,jdbcType应该填写为ORACLECURSORQ?br /> 不过在PostgreSQL中不能用ORACLECURSORQ得用OTHER?/p> <p>dao的实玎ͼ <br /> 定义map文g parameters Q?br />  List list;<br />         HashMap<String, String> parameters = new HashMap<String, String>();<br />         parameters.put("loginName", loginName);<br />         parameters.put("loginPasswd", loginPasswd);<br />         list=getSqlMapClientTemplate().queryForList("test", parameters);//q样来得到返回的l果集?br />  return list;<br /> Ҏ(gu)2Q?同时q回多个l果Q?/p> <p>函数Q?br /> CREATE OR REPLACE FUNCTION test(IN _login VARCHAR(32), <br /> IN _psw VARCHAR(32), <br /> OUT _ret INTEGER,<br />  OUT _id INTEGER, <br /> OUT _name VARCHAR(32), <br /> OUT _email VARCHAR(32), <br /> OUT _phone VARCHAR(20), <br /> OUT _ref refcursor ---q回一个游?br /> )<br />   RETURNS record <br />   AS<br /> $BODY$<br /> declare video_cur refcursor;<br /> BEGIN<br />     select id,name,email,phone<br />     into _id,_name,_email,_phone<br />     from test<br />     where tx_account.`loginname`=_login and tx_account.`password`=MD5(_psw) and active=1;</p> <p>    open _ref  for<br />     select id , title from test1;<br /> END<br /> $BODY$<br />   LANGUAGE 'plpgsql' VOLATILE;<br /> ALTER FUNCTION test(integer) OWNER TO postgres;</p> <p>如果q回多个l果集,p使用q回伪类?record可以在输出参C指定游标为其中一个out参数<br /> ibatis文g</p> <p>        out 参数输出游标<br />  <parameterMap id="ParameterMap" class="map" >   <br />     <parameter property="login " jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> <br />     <parameter property="password" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/><br />     <parameter property="ret" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/><br />     <parameter property="id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>    <br />     <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/><br />     <parameter property="phone" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/><br />     <parameter property="email" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/><br />     <parameter property="ref" jdbcType="OTHER" javaType="java.sql.ResultSet" mode="OUT"/>  //q回l果?nbsp;    </p> <p>   </parameterMap></p> <p> <procedure id="test" parameterMap="ParameterMap" resultMap="ResultMap">    <br />      {call test(?,?,?,?,?,?,?,?)}  <br />    </procedure></p> <p>dao的实现跟Ҏ(gu)1 相同     </p> <p> </p> <p> </p> <img src ="http://www.tkk7.com/agun/aggbug/184131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/agun/" target="_blank">agun</a> 2008-03-06 09:12 <a href="http://www.tkk7.com/agun/archive/2008/03/06/184131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www-66409b.com" target="_blank">ѿٸƵ</a>| <a href="http://5ggy.com" target="_blank">Ʒɫѿ</a>| <a href="http://519vip.com" target="_blank">ֳִִˬƵ</a>| <a href="http://ttvv77.com" target="_blank">2020þþƷۺһ</a>| <a href="http://2002tw.com" target="_blank">ȫëƬ߲</a>| <a href="http://nkldj.com" target="_blank">þþþ޾Ʒվ </a>| <a href="http://2c06xyz.com" target="_blank">þþžȫ</a>| <a href="http://fphs666.com" target="_blank">޾Ʒ͵Բ</a>| <a href="http://777mecom.com" target="_blank">߳ˮ</a>| <a href="http://440878.com" target="_blank">Ĺ˾Ʒþ޾ƷA뾫Ʒ</a>| <a href="http://by9277.com" target="_blank">ҳվ߹ۿ</a>| <a href="http://huakangweicai.com" target="_blank">޾ƷɫӰԺ</a>| <a href="http://kdltuliao.com" target="_blank">ŷŮƬѲƵ</a>| <a href="http://hs718.com" target="_blank">޹߹ۿ</a>| <a href="http://vinsotec.com" target="_blank">˸ŮѲžþþ</a>| <a href="http://nblfkj.com" target="_blank">޹һ˾þþƷ</a>| <a href="http://www4438xx2.com" target="_blank">Ʒһģʽ</a>| <a href="http://mtspvip.com" target="_blank">޻ɫĻ</a>| <a href="http://www132126.com" target="_blank">þþøƵ</a>| <a href="http://mtspvip.com" target="_blank">޾Ʒŷۺ</a>| <a href="http://bjgelinhotel.com" target="_blank">avһ߹ۿ</a>| <a href="http://bzzxyp.com" target="_blank">Ӳֳִˬѿ</a>| <a href="http://hnshlt.com" target="_blank">þþ޾Ʒ</a>| <a href="http://simupiao.com" target="_blank">þóѲվ</a>| <a href="http://cz655.com" target="_blank">߹ۿ</a>| <a href="http://516kd.com" target="_blank">պһѹۿ </a>| <a href="http://bet06966.com" target="_blank">avr</a>| <a href="http://6ork.com" target="_blank">˿Ƶ</a>| <a href="http://ganbadei.com" target="_blank">þþƷAVɫ</a>| <a href="http://123470c.com" target="_blank">ԲaëƬ</a>| <a href="http://czhos.com" target="_blank">AVѹۿ</a>| <a href="http://jcthbank.com" target="_blank">þþƷƵ</a>| <a href="http://kouchoubao.com" target="_blank">߹ۿѸƵ</a>| <a href="http://fsszx888.com" target="_blank">ɫһ</a>| <a href="http://xieehuomh.com" target="_blank">ӰԺ޹һҳ</a>| <a href="http://mogo321.com" target="_blank">˳Ƶ߹ۿվ</a>| <a href="http://343dd.com" target="_blank">ҸŮˬ߳Ƭ</a>| <a href="http://6006284.com" target="_blank">޹ӰԺ</a>| <a href="http://micehunan.com" target="_blank">ҰһƵ</a>| <a href="http://w6336.com" target="_blank">Ʒ޾Ʒ</a>| <a href="http://kfdingrui.com" target="_blank">޹Ʒ˾þ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>