복붙노트

[MONGODB] MongoDB를 텍스트 검색 및 여러 검색 단어

MONGODB

MongoDB를 텍스트 검색 및 여러 검색 단어

나는 내 applicaiton에 전체 텍스트 기능을 제공하기 위해 사용하고 있음을 배열 "키"에 인덱스를 가지고있다.

2.4.3의 출시와 함께, 나는 "텍스트"인덱스 유형을 사용하고 싶습니다. 내 배열 "키"에 "텍스트"인덱스 유형을 보험과는 (예전 키워드 전체 텍스트 방식보다 빠르게) 빠른 작업 SUPER 보인다.

문제는 내 응용 프로그램은 필드가 포함 (AND) 있다고 가정한다. 기본적으로 텍스트는 논리합 내 매개 변수를 검색 할 수 있습니다.

포괄적 텍스트 검색을 실행할 수있는 방법을 사람의 노하우를합니까?

예를 들면 :

db.supplies.runCommand("text", {search:"printer ink"})

대신 어느 프린터 또는 잉크 모든 결과를 프린터의 잉크 모두에 결과를 반환한다.

해결법

  1. ==============================

    1.시도에 보내기

    시도에 보내기

    db.supplies.runCommand("text", {search:"\"printer\" \"ink\""})
    

    또한, 여기에 문서에서 인용입니다 :

    희망이 도움이.

  2. ==============================

    2.당신은 큰 따옴표로 각 단어를 포장 할 수 있습니다 :

    당신은 큰 따옴표로 각 단어를 포장 할 수 있습니다 :

    let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' ');
    match.$text = { $search: keywords, $caseSensitive: false };
    

    사용자가이 작동하지 않습니다 인용 된 문자열을 입력하면 단점이있다. 먼저 인용 문자열을 구문 분석해야 할 것이다.

  3. ==============================

    3.@alecxe 앞서 지적한 바와 같이, 할 그리고 당신은 큰 따옴표로 각 검색 단어를 필요 텍스트 인덱스 열을 검색 할 수 있습니다. 다음은 귀하의 요구 사항에 대한 빠른 한 줄입니다.

    @alecxe 앞서 지적한 바와 같이, 할 그리고 당신은 큰 따옴표로 각 검색 단어를 필요 텍스트 인덱스 열을 검색 할 수 있습니다. 다음은 귀하의 요구 사항에 대한 빠른 한 줄입니다.

    db.supplies.runCommand("text", {search: "printer ink".split(" ").map(str => "\""+str+"\"").join(' ')})
    
  4. ==============================

    4.여기에 내가 노드에 subwords를 사용하여 검색 할 만든 간단한 기능입니다. 누군가가 도움이되기를 바랍니다

    여기에 내가 노드에 subwords를 사용하여 검색 할 만든 간단한 기능입니다. 누군가가 도움이되기를 바랍니다

    이 프린터와 잉크를 만족해야하지만, $ 텍스트 검색 그래서 여기 내 간단한 함수입니다 허용하지 않습니다 그럼 PRI의 NKS에 대한 사용자 검색을 가정하자 :

        var makeTextFilter = (text) => {
        var wordSplited = text.split(/\s+/);
        /** Regex generation for words */
        var regToMatch = new RegExp(wordSplited.join("|"), 'gi');
        let filter = [];
        searchFieldArray.map((item,i) => {
            filter.push({}); 
            filter[i][item] = {
                $regex: regToMatch,
                $options: 'i'
            }
        })
    
        return filter;
      }
    

    이 같은 쿼리에서 사용

    let query = {...query, $or: makeTextFilter(textInputFromUser)}
    tableName.find(query, function (err, cargo_list)
    
  5. from https://stackoverflow.com/questions/16902674/mongodb-text-search-and-multiple-search-words by cc-by-sa and MIT license