我需要在pouchdb和pouchdb-find中进行不区分大小写的搜索

时间:2017-09-12 20:33:50

标签: couchdb ionic3 pouchdb

我的项目运作完美无缺,我遇到的唯一问题是搜索具有案例敏感性。它可以很好地搜索子字符串,但如果我输入“Test”,它会忽略“test”作为有效结果。

我正在使用pouchdb-find使搜索更容易,更与云量搜索相关,限制/跳过参数用于分页。

我正在使用ion-searchbar为用户键入查询的字符串。

这是我的控制者代码的摘录:

@Component({
    selector: 'page-notas',
    templateUrl: 'notas.html'
})
export class NotasPage {
    notas: Array<Object> = [];
    zone: any = new NgZone({ enableLongStackTrace: false });
    db: any = new PouchDB('banco_de_dados.bd');
    db_limit = 10;

    pouch_query: object = {
        selector: { data_emissao: { $gt: null } },
        sort: [ {'data_emissao' : 'desc'} ],
        limit: 10,
        skip: 0,
    };

    constructor(
        private scanner: BarcodeScanner,
        private toastCtrl: ToastController,
        private googleAnalytics: GoogleAnalytics,
        public navCtrl: NavController,
        public alertCtrl: AlertController,
        public modalCtrl: ModalController
    ) {
        this.notas = [];
    }
    //...
    // unrelated code in here
    //...
    onInput($event:any) {
        this.googleAnalytics.trackEvent('SearchBar', 'onInput', 'Event: ' + $event);
        //Here is the query options, it's working, the only problem is that it's case sensitive
        this.pouch_query = {
            selector: { 
            data_emissao: { $gt: null },
            descricao: { $regex: this.search_query }
            },
            sort: [ {'data_emissao' : 'desc'} ],
            limit: 10,
            skip: 0
        };
        // this function is a little bigger
        // butit just makes the search and list it in a ion-list
        this.refresh();
    }
}

这是组件代码摘录。

<!-- MORE UNRELATED CODE -->
<ion-searchbar
    [(ngModel)]="search_query"
    [showCancelButton]="shoulShowCancelButton" 
    (ionInput)="onInput($event)"
    (ionCancel)="onCancel($event)">
</ion-searchbar>
<!-- MORE UNRELATED CODE -->

2 个答案:

答案 0 :(得分:5)

Javascript内置了一个正则表达式函数,所以你只需要在regexas中添加不敏感选项

RegExp(<string>, "i")

您可以在http://localhost中找到正则表达式选项列表。这是完整的代码:

this.pouch_query = {
  selector: { 
    data_emissao: { $gt: null },
    descricao: { $regex: RegExp(this.search_query, "i") }
  },
  sort: [ {'data_emissao' : 'desc'} ],
  limit: 10,
  skip: 0
};

答案 1 :(得分:2)

您可能希望使用面向“自由文本”匹配的pouchdb-quick-search插件,而不是使用pouchdb-find系统“使此字段等于此字段”。

自由文本搜索索引是使用源文本的预处理形式构建的 - 通常会阻止(删除)单词结尾,忽略大小写,并删除停用单词(a,和)。查询更加流畅,“最佳匹配”在列表顶部返回

pouchdb-quick-search更接近你提到的Cloudant Search(后者又基于Apache Lucene库)。您可以使用PouchDB同时使用这两种类型的查询:pouchdb-find用于确定性查询,pouchdb-quick-search用于自由文本匹配。