django问题:搜索功能,contains的用法

django问题:搜索功能,contains的用法,第1张

搜索还是用lucene吧。研究一下,很快就可以上手。实在不成你用whoosh,可以实现多个字段,复杂逻辑的搜索。

contains我没有用过,不过既然它支持一个字段的索引,按道理就可以支持多个字段。 原理上,它应该是自己对MYSQL的某个字段做了一个分词与索引。

另外有些数据库本身也支持一些简单的搜索,只是数据量大会效率低。

取包含 '卷期号' 三个字的节点 //ul[@id='side-menu']/li/a[contains(text(),"卷期号")]

取其内容 //ul[@id='side-menu']/li/a[contains(text(), '卷期号')]/text()

>

在查询xml的时候,常常要知道某个元素的值或其属性值是否包含了某一值。如果采用把xml转换成字符串的做法势必造成系统性能的下降。

jdom:提供了解释xml的途径;

xpath:提供了查询xml的一种途径。大家或许对数据库的sql查询语句非常熟悉,xpath就有点类似于sql查询语句,只不过它是xml的查询语言。

contains:此函数在某种程度上有点类似sql的like关键字。

如,xml的结构如下:

<xml version="10"

encoding="UTF-8">

<root>

<element name="第一层第一个元素"

type="ele" order="第一个">

<sub name="第二层第一个子元素" type="sub"

order="第一个">

第一层第一个元素下面的第二层第一个子元素

</sub>

<sub name="第二层第二个子元素" type="sub" order="第二个">

第一层第一个元素下面的第二层第二个子元素

</sub>

<sub name="第二层第三个子元素" type="sub" order="第三个">

第一层第一个元素下面的第二层第三个子元素

</sub>

</element>

<element name="第一层第二个元素" type="ele"

order="第二个">

<sub name="第二层第一个子元素" type="sub" order="第一个">

第一层第二个元素下面的第二层第一个子元素

</sub>

<sub name="第二层第二个子元素" type="sub" order="第二个">

第一层第二个元素下面的第二层第二个子元素

</sub>

<sub name="第二层第三个子元素"

type="sub" order="第三个">

第一层第二个元素下面的第二层第三个子元素

</sub>

<sub name="第二层第十二个子元素" type="sub"

order="第十二个">

第一层第二个元素下面的第二层第十二个子元素

</sub>

</element>

</root>

(1)如要查询子元素中顺序含有“二” 的子元素,即查询顺序中带“二”的元素;包括:

<sub name="第二层第二个子元素"

type="sub" order="第二个">

第一层第一个元素下面的第二层第二个子元素

</sub>

<sub name="第二层第二个子元素" type="sub"

order="第二个">

第一层第二个元素下面的第二层第二个子元素

</sub>

<sub

name="第二层第十二个子元素" type="sub" order="第十二个">

第一层第二个元素下面的第二层第十二个子元素

</sub>

则xpath的写法为:xPath="/root/element/sub[contains(@order,'二')]";

(2)如要查询子元素值中含有“第一层第二个”,即查询sub中值包含“第一层第二个”;包括:

<sub name="第二层第一个子元素"

type="sub" order="第一个">

第一层第二个元素下面的第二层第一个子元素

</sub>

<sub name="第二层第二个子元素" type="sub"

order="第二个">

第一层第二个元素下面的第二层第二个子元素

</sub>

<sub

name="第二层第三个子元素" type="sub" order="第三个">

第一层第二个元素下面的第二层第三个子元素

</sub>

<sub name="第二层第十二个子元素"

type="sub" order="第十二个">

第一层第二个元素下面的第二层第十二个子元素

</sub>

则xpath的写法为:xPath="/root/element/sub[contains(contains,'第一层第二个')]";

下面是源代码:

import orgjdom;

import javautil;

import

orgjdomxpathXPath;

public void findNodes(Document xmlDoc){

Element

ele=xmlDocgetRootElement();

try{

String

xPath1="/root/element/sub[contains(@order,'二')]";

List

list1=XPathselectNodes(ele,xPath1);

}catch(Exception

e){

eprintStackTrace();

}

try{

String

xPath2="/root/element/sub[contains(contains,'第一层第二个')]";

List

list2=XPathselectNodes(ele,xPath2);

}catch(Exception

e){

eprintStackTrace();

}

用PYTHON ,DJANGO 做站,在通常的情况下,需要用到 orM 的查询方法,比如objectfilter(tag__contains='keywords')

在这种情况下,如果你跟踪 sql 语句,你会发现,SQL 语句会生成 select like bianry '%keywords%', 如果是这样的语句,在某些情况是下是会出问题的,也就是说查询出来的数据可能会比你预计的少。

如果你用 raw sql 查总数 select count() from table where like '%keywords%' 得到数量可能比你用ORM 采用上面的方式得到的数据多,问题就在于生成的条件问题。

后来查询了 django 说明,如果把ORM 语句变成:objectfilter(tag__icontains='keywords') 就好了。

注意contains ,icontains 的区别 后来从django官网查到了说明:

select from member where user_name like '%李%',这样就查找所有“李”字的字段。select from member where user_name ='李',这样就查找是“李”字的字段

以上就是关于django问题:搜索功能,contains的用法全部的内容,包括:django问题:搜索功能,contains的用法、XPath匹配含有指定文本的标签---contains的用法、xpath contains函数中能用参数吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10210572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存