3

How do I set the Post SearchResult interface to the search return value

I can't set the interface to get the return results You can review the code below

dependencies

   "@nestjs/elasticsearch": "^8.1.0",
   "@elastic/elasticsearch": "^8.2.1",
   "@types/elasticsearch": "^5.0.40",

interface Post

export interface PostSearchResultInterface {
    hits: {
        total: {
            value: number;
        };
        hits: Array<{
            total: {
                value: number;
            }
            _source: PostSearchBodyInterface;
        }>;
    };
}

code

     const  search  = await this.elasticsearchService.search<PostSearchBodyInterface>({
                index: this.index,
                from: offset,
                size: limit,
                body: {
                    query: {
                        bool: {
                            should: {
                                multi_match: {
                                    query: text,
                                    fields: ['title', 'story', 'other_titles']
                                }
                            },
                            filter: {
                                range: {
                                    id: {
                                        gte: startId
                                    }
                                }
                            }
                        },
                    },
                    sort: {
                        id: {
                            order: 'asc'
                        }
                    }
                }
            }) ;


             // error here 
            let count = search.hits.total.value
           
            const hits = search.hits.hits;
            const results = hits.map((item) => item._source);
            return {
                count : startId ? separateCount : count,
                results
            }

error TS2339: Property 'value' does not exist on type 'number | SearchTotalHits'. Property 'value' does not exist on type 'number'.

ERROR: let count = search.hits.total.value
2
  • are you sure that elasticsearch is not reurning any error in response and search is returning 200 response code ? Commented Jul 4, 2022 at 5:38
  • 1
    yes if i skip the interface it's run but it's not recognize interface Commented Jul 4, 2022 at 5:47

1 Answer 1

5

Assuming dependencies are (as question posted) :

"@nestjs/elasticsearch": "^8.1.0",
"@elastic/elasticsearch": "^8.2.1",
"@types/elasticsearch": "^5.0.40",

First, create a dedicated type for the indexed document, for example :

export type Document = { 
  title: string, 
  tags: string[]
};

Then, simply search for documents :

const a = await this.elastic.search<Document>({ //...request... });

const total = a.hits.total;
const documents = a.hits.hits.map(document => {
  // query metadata fields returned by elastic
  document._id;

  // get fields for <Document> type
  document._source.title...
  document._source.tags...
})
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.