V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xixijun
V2EX  ›  编程

请教各位大佬,编写一个类似 google 搜索语法的搜索工具有什么好的思路呢?

  •  
  •   xixijun · 2018-10-29 16:35:26 +08:00 · 2918 次点击
    这是一个创建于 2218 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这里数据库用的 es,

    大概想了一下,最大的难点是如何解析查询参数。 比如下面的搜索语法,(似乎不支持 markdown table,大家将就着看吧)

    |搜索语法|语法解释 |

    |-------|---------|

    |"test101" | 关键字短语 |

    |host:v2ex.com | 主机名|

    |filetype:PDF | url 以 pdf 结尾|

    |inurl:php | url 包含 php|

    |intitle:登录 | 网页标题包含"登录"|

    |intext:"后台" | 网页内容包含"后台"|

    他们之间可能还需要有逻辑符号 + 且 ^ 或 ~ 非 的联系

    比如"test101 + host:v2ex.com" 搜索主机名是 V2EX 并且内容包含 test101 的结果。

    这里我的思路是用 pyparsing 或者正则提取 搜索语法的关键字,再结合 es 的搜索语法匹配相应的查询语法得出结果

    有老哥有更好的思路吗,不甚感激~

    8 条回复    2021-05-25 14:57:56 +08:00
    NjcyNzMzNDQ3
        1
    NjcyNzMzNDQ3  
       2018-10-29 16:58:34 +08:00
    Create a search engine
    NjcyNzMzNDQ3
        2
    NjcyNzMzNDQ3  
       2018-10-29 16:59:16 +08:00
    google Create a search engine
    xixijun
        3
    xixijun  
    OP
       2018-10-29 17:12:29 +08:00
    @NjcyNzMzNDQ3 可能我没说清楚,ES 数据已经有了,只差搜索语法的实现
    yuikns
        4
    yuikns  
       2018-10-31 07:35:33 +08:00
    因此你就是想做个文法分析。一种方法是手撸。先 tokenlize, 然后构造 ast,然后编译成 es query。这个入手比较简单,但是手撸的话扩展没那么快。

    另一种是 yacc 工具。比如 python 你可以试试这个: https://github.com/dabeaz/ply
    LetFoxRun
        5
    LetFoxRun  
       2018-10-31 19:10:15 +08:00
    @xixijun 这个不应该是语法,应该是索引。
    xixijun
        6
    xixijun  
    OP
       2018-11-06 18:03:33 +08:00
    @yuikns 谢谢~,我研究下
    @LetFoxRun 也算是吧
    hanssx
        7
    hanssx  
       2021-05-25 14:16:03 +08:00
    @xixijun 老哥,最后怎么解决的呀。
    xixijun
        8
    xixijun  
    OP
       2021-05-25 14:57:56 +08:00
    @hanssx 用上面老哥提供的 https://github.com/dabeaz/ply 构造的 es query
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   930 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:15 · PVG 06:15 · LAX 14:15 · JFK 17:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.