首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何转义查询参数?

如何转义查询参数?
EN

Stack Overflow用户
提问于 2018-03-20 03:01:47
回答 1查看 1.6K关注 0票数 0

我使用白热化 (前面有一个http服务器)索引和查询文档。

我需要执行如下所示的查询,该查询应该查询与channelID值匹配的文档。如何在查询语法中转义查询字段(在本例中是channelID的值)?

代码语言:javascript
复制
 query.NewQueryStringQuery("channelID:http://example.com?some-params-with$-+badChars"). 

我不能只对其进行urlencode编码,因为如果这样做,它将与文档索引中的字段不匹配(该字段的值未编码)。

Update(testcase)

代码语言:javascript
复制
package main

import (
    "github.com/blevesearch/bleve"
    //"github.com/blevesearch/bleve/search"
    "github.com/blevesearch/bleve/search/query"

    "bytes"
    "flag"
    log "github.com/golang/glog"
)

type Data struct {
    ID      string
    Message string
    URI     string
}

func main() {
    flag.Parse()
    defer log.Flush()

    mapping := bleve.NewIndexMapping()
    index, err := bleve.New("example.bleve", mapping)
    if err != nil {
        panic(err)
    }
    d := Data{
        ID:      "someID",
        Message: "Hello",
        URI:     `https://www.google.co.uk/search?q=google+search&oq={}///\}ie=UTF-8`,
    }
    if err := index.Index(d.ID, d); err != nil {
        panic(err)
    }

    //index, _ := bleve.Open("example.bleve")
    query := query.NewQueryStringQuery("URI:" + Escape(d.URI))
    searchRequest := bleve.NewSearchRequest(query)
    result, _ := index.Search(searchRequest)
    log.Errorf("total hits %v", result.Total)
}

func Escape(s string) string {
    ra := []string{"+", "-", "=",
        "&", "|", ">",
        "<", "!", "(", ")", "{",
        "}", "[", "]", "^",
        `~`, `*`, `?`, `:`, `\\`, `/`, `\`, ` `}
    exists := func(v string) bool {
        for _, s := range ra {
            if v == s {
                return true
            }
        }
        return false
    }
    buf := bytes.NewBuffer(nil)
    var prevBack bool
    for _, v := range s {
        if prevBack || !exists(string(v)) {
            buf.WriteString(string(v))
            prevBack = false
        } else {
            buf.WriteString(`\`)
            buf.WriteString(string(v))
            if string(v) == `\` {
                prevBack = true
            }
        }
    }
    return buf.String()
}
EN

回答 1

Stack Overflow用户

发布于 2018-03-20 08:16:50

你只是在特殊人物前面放了一个反斜杠。您可以找到文档中所有特殊字符的列表(在转义下面的底部):http://www.blevesearch.com/docs/Query-String-Query/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49375711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档