带有部分句子匹配的 Django 文本搜索更新到 django3

     2023-02-23     173

关键词:

【中文标题】带有部分句子匹配的 Django 文本搜索更新到 django3【英文标题】:Django text search with partial sentence match update to django3 【发布时间】:2021-05-03 04:44:18 【问题描述】:

我正在尝试在 Django postgres 中应用部分搜索,与此处描述的完全相同 django-text-search-with-partial-sentence-match 我发现有一个很好的解决方案

from psycopg2.extensions import adapt

from django.contrib.postgres.search import SearchQuery


class PrefixedPhraseQuery(SearchQuery):
"""
Alter the tsquery executed by SearchQuery
"""
    def as_sql(self, compiler, connection):
        # Or <-> available in Postgres 9.6
        value = adapt('%s:*' % ' & '.join(self.value.split()))

        if self.config:
            config_sql, config_params = compiler.compile(self.config)
            template = 'to_tsquery(::regconfig, )'\
                .format(config_sql, value)
            params = config_params

        else:
            template = 'to_tsquery()'\
                .format(value)
            params = []

        if self.invert:
            template = '!!()'.format(template)

        return template, params

它适用于 python 3.6,但不适用于 3.9。 不同的是,比 3.6 SearchQuery 继承自 Value:

class SearchQuery(SearchQueryCombinable, Value):
    output_field = SearchQueryField()
    SEARCH_TYPES = 
        'plain': 'plainto_tsquery',
        'phrase': 'phraseto_tsquery',
        'raw': 'to_tsquery',
    
    def __init__(self, value, output_field=None, *, config=None, invert=False, search_type='plain'):
        self.config = config
        self.invert = invert
        if search_type not in self.SEARCH_TYPES:
            raise ValueError("Unknown search_type argument '%s'." % search_type)
        self.search_type = search_type
        super().__init__(value, output_field=output_field)

并且在 python 3.9 SearchQuery 中继承自 Func:

class SearchQuery(SearchQueryCombinable, Func):
    output_field = SearchQueryField()
    SEARCH_TYPES = 
        'plain': 'plainto_tsquery',
        'phrase': 'phraseto_tsquery',
        'raw': 'to_tsquery',
        'websearch': 'websearch_to_tsquery',
    

    def __init__(self, value, output_field=None, *, config=None, invert=False, search_type='plain'):
        self.function = self.SEARCH_TYPES.get(search_type)
        if self.function is None:
            raise ValueError("Unknown search_type argument '%s'." % search_type)
        if not hasattr(value, 'resolve_expression'):
            value = Value(value)
        expressions = (value,)
        self.config = SearchConfig.from_parameter(config)
        if self.config is not None:
            expressions = (self.config,) + expressions
        self.invert = invert
        super().__init__(*expressions, output_field=output_field)

Func 与 Value 不同,没有self.value

class Func(SQLiteNumericMixin, Expression):
    """An SQL function call."""
    function = None
    template = '%(function)s(%(expressions)s)'
    arg_joiner = ', '
    arity = None  # The number of arguments the function accepts.

    def __init__(self, *expressions, output_field=None, **extra):
        if self.arity is not None and len(expressions) != self.arity:
            raise TypeError(
                "'%s' takes exactly %s %s (%s given)" % (
                    self.__class__.__name__,
                    self.arity,
                    "argument" if self.arity == 1 else "arguments",
                    len(expressions),
                )
            )
        super().__init__(output_field=output_field)
        self.source_expressions = self._parse_expressions(*expressions)
        self.extra = extra

价值看起来像这样

class Value(Expression):
    """Represent a wrapped value as a node within an expression."""
    def __init__(self, value, output_field=None):
        """
        Arguments:
         * value: the value this expression represents. The value will be
           added into the sql parameter list and properly quoted.

         * output_field: an instance of the model field type that this
           expression will return, such as IntegerField() or CharField().
        """
        super().__init__(output_field=output_field)
        self.value = value

谁能帮我将代码示例调整为 python 3.9 或推荐任何类似搜索的解决方案?

【问题讨论】:

【参考方案1】:

所以我们很清楚,您的问题不是 Python 版本,而是 Django 版本。

你要找的应该是self.source_expressions[0]

但是,如果我今天重写此代码,我会先查看 raw search type (example),然后使用邻近运算符 &lt;-&gt; (example) 传递我自己的查询。

【讨论】:

感谢您重新搜索原始搜索类型。当我尝试用self.source_expressions[0] 替换self.value 时,我收到错误value = adapt("%s:*" % " | ".join(self.source_expressions[0].split())) AttributeError: 'SearchConfig' object has no attribute 'split' 。我试过str(self.source_expressions[0]),但后来我得到return self.cursor.execute(sql, params) django.db.utils.ProgrammingError: syntax error in tsquery: "&lt;django.contrib.postgres.search.SearchConfig | object | at | 0x7f1c461bc7f0&gt;:*" 抱歉格式化,但comment-formatting的一些规则似乎没有效果 您是否尝试将raw 查询与&lt;-&gt; 运算符一起使用? 是的。它确实有效。谢谢。无论如何我对以前的代码很好奇,所以对我有用的是self.source_expressions[1]

带有部分字符串的猫鼬文本搜索

】带有部分字符串的猫鼬文本搜索【英文标题】:Mongoosetext-searchwithpartialstring【发布时间】:2016-05-1104:33:09【问题描述】:您好,我正在使用mongoose来搜索我收藏中的人。/*Personmodel*/name:first:String,last:String现在我想搜索有查询的... 查看详情

django 显示文本字段

...时间】:2012-01-0212:26:19【问题描述】:我在Django中有一个带有textfields的表单,用户逐行输入文本。当我查看管理端的条目时,我看到了用户是如何写的,但是当我在我的网站上显示它时,在Django模板中,它只是加入了句子,我... 查看详情

三剑客之grep

...文件内容grep:根据模式匹配搜索文件内容以匹配所需的部分内容,则部分匹配-i:匹配时忽略大小写-o:只显示匹配的内容,并分行显示-v:匹配相反的内容-c:统计文件或文本中包含匹配字符串的行数-E:支持扩展正则表达式-A... 查看详情

怎么在linux用less查看文件

...使用下面的方式在文件中搜索。搜索时整个文本中匹配的部分会被高亮显示。向前搜索/-使用一个模式进行搜索,并定位到下一个匹配的文本n-向前查找下一个匹配的文本N-向后查找前一个匹配的文本向后搜索?-使用模式进行搜索... 查看详情

文本分类与句子分类[重复]

...道-如果一个人对整个文本应用句子分类,然后根据其大部分句子被分类到的内容对段落进行分类-这会算作正确的文本分类 查看详情

多类文本分类:如果输入与类不匹配,则新类

...我遇到的一个常见问题是我的训练集没有“色情”类别和带有色情材料归类为“金 查看详情

使用 Pandas 搜索文本中的所有匹配项

...文本并执行搜索。我正在使用熊猫,因为我的短文本集合带有时间戳,并且很容易将这些短文本组织在单个数据结构中作为熊猫 查看详情

使用re.sub将文本替换为匹配到的内容

...中,经常会碰到需要将某些指定字符替换掉,而保留其余部分的情况,比如:上述文本中的是LaTeX中的特殊字符,在整个句子中并没有什么实际含义,反而会影响我对文本的后续处理,所以我需要把上述文本中的花括号去掉。然... 查看详情

将文本附加到正则表达式匹配的一部分

】将文本附加到正则表达式匹配的一部分【英文标题】:Appendtexttopartofregexmatch【发布时间】:2014-10-2500:58:48【问题描述】:我需要制作一些时髦的json。基本上格式应该是"userName:string":"teddyblackk"注意那里的字符串。鉴于正常的jso... 查看详情

匹配大量不同的句子(使用正则表达式模式解析)

】匹配大量不同的句子(使用正则表达式模式解析)【英文标题】:matchinghighnumberofdifferentsentences(usingregexppatternsparsing)【发布时间】:2019-10-3004:20:46【问题描述】:我想使用regexps构建文本句子分类器(用于聊天机器人自然语言... 查看详情

如果仅句子包含搜索列表中的任何关键字,则从数据框文本列中选择句子

】如果仅句子包含搜索列表中的任何关键字,则从数据框文本列中选择句子【英文标题】:Selectingsentencesfromadataframetextcolumnifonlythesentencescontainanyofthekeywordsfromasearchlist【发布时间】:2021-01-3109:17:20【问题描述】:我有一个数据框... 查看详情

shellgrep命令详解

...出的关键字用颜色显示;(10)-o:只输出匹配到的文本部分(11)-r:grep的参数filename为目录时可以加上本选项表示递归搜索(12)-e:该选项加上正则表达式就是一个需要匹配的模式(13)--include:指定需要搜索的文件 --exclu... 查看详情

如何强制文本框更新其文本

...文本设置到文本框中的问题。我已经尝试过SetWindowText、带有EM_SETSEL和EM_REPLACESEL的SendMessage,以及其他一些我想不出来的东西。大部分情况下,我都是成功的,除了一件 查看详情

linux中最常用的三大文本处理工具之grep(代码片段)

...号-w:被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker-c:显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是... 查看详情

带有 jquery 的 Django 模板:现有页面上的 Ajax 更新

】带有jquery的Django模板:现有页面上的Ajax更新【英文标题】:Djangotemplatewithjquery:Ajaxupdateonexistingpage【发布时间】:2010-09-1713:33:45【问题描述】:我有一个带有表单的GoogleAppEngine。当用户单击提交按钮时,将调用AJAX操作,服务器... 查看详情

mfc中在指定的文档搜索输入框中的指定内容并显示到指定的文本框中的按钮代码该怎么写啊?在线等

...,那是C语言的基本功,应该不用多说。显示和按钮控制部分:编辑框使用classwizard定义一个CString型变量,如m_edit1;文本框使用classwizard定义一个CString型变量,如m_edit2;用classwizard给按钮增加一个消息响应函数,OnClick。在OnClick函数... 查看详情

grepsedawk基础

...行数-w:精确匹配,只匹配整个单词,而不是字符串的一部分 -o:只显示被模式匹配到的字符串-A#:after,后#行-B#:before,前#行-C#:context,前后各#行- 查看详情

搜索视图和可过滤:显示带有搜索文本的栏

】搜索视图和可过滤:显示带有搜索文本的栏【英文标题】:SearchViewandFilterable:Showingabarwithsearchedtext【发布时间】:2016-01-0407:55:15【问题描述】:我正在使用SearchView和ListView并实现Filterable来过滤记录。它工作正常,除了两个问... 查看详情